xargs가 tail -f와 함께 작동하지 않는 이유는 무엇입니까?

xargs가 tail -f와 함께 작동하지 않는 이유는 무엇입니까?

tail -f /var/log/syslog | grep"arpwatch" 모드를 갖고 jabber를 통해 각 줄을 자체적으로 보내길 원합니다. xargs 사용xmpp [email protected]

tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]

작동 안함.

하지만tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]

좋은 결과.

나는 이것이 내가 이해하지 못하는 몇 가지 기본적인 xargs문제 라고 생각합니다 tail -f.

답변1

xargs command한 번의 호출로 최대한 많은 입력 항목(행, 단어)을 수집해 보세요.주문하다이며, 데이터 입력에 걸리는 시간은 특별히 신경 쓰지 않습니다. tail프로세스가 종료되거나 버퍼 xargs가 가득 차면 실행됩니다.주문하다그리고 당시 받은 인수. 그러나 tail -f일반적으로 자체적으로 수행되지 않으며 명령줄 인수가 매우 제한적일 수 있으므로 전혀 작동하지 않는 것처럼 보입니다.

xargs -n1한 번에 하나의 입력만 전달 하도록 할 수 있습니다 .주문하다, 그러나 xargs공백을 사용하면 입력이 항목으로 분할되므로 입력 줄을 사용하면 foo bar명령이 두 번 실행됩니다.

GNU xargs를 사용하면 xargs -n1 -d '\n'원하는 작업을 수행할 수 있습니다.주문하다입력 줄당 한 번씩 전체 줄이 단일 인수로 전달됩니다.

and 를 사용하거나 사용하지 않고 시도해 보고 -d출력 -n타이밍을 확인하세요.

$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'

xargs -L 1그것도 작동하지만 전체 줄을 하나의 인수로 전달하는 대신 여전히 줄을 별도의 인수로 분할합니다.

답변2

grep--line-buffered추가 입력을 기다리지 않고 즉시 각 행을 출력하도록 선택할 수 있습니다 .

의 경우 xargs@ikkachu가 제안한 대로 공백 대신 개행 문자로 구분해야 합니다. 당신은 그것을 사용할 수 있습니다 xargs -L.

이것은 작동합니다:

tail -f /var/log/syslog \
  | grep --line-buffered arpwatch \
  | xargs -L1 sendxmpp [email protected]

관련 정보