tail -f /var/log/syslog | grep パターン「arpwatch」を使用して、すべての行をjabber経由で自分宛てに送信します:xmpp [email protected] xargsを使用する
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
動作しません。
しかし、tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
うまく機能します。
xargsの基本的なことだと思います およびtail -f わかりません。
承認された回答:
xargs command コマンドの1回の呼び出しに対して、できるだけ多くの入力項目(行、単語)を収集しようとします 、入力データのタイミングは特に気にしません。 tailの場合 プロセスが強制終了されるか、xargs sバッファがいっぱいになると、コマンドが実行されます それまでに受け取った引数で。ただし、tail -f 通常、それ自体では終了せず、コマンドライン引数の制限が大きくなる可能性があるため、まったく機能しないようです。
xargs -n1を使用できます コマンドに一度に1つの入力項目のみを渡すようにする 、しかし、xargsという事実に見舞われるでしょう 空白を使用して入力をアイテムに分割するため、foo barの入力行 コマンドが2回実行されます。
GNU xargsの場合、xargs -n1 -d '\n' やりたいことを実行する必要があります:コマンドを実行します 入力行ごとに1回、行全体が1つの引数として渡されます。
試してみてください。 -dがある場合とない場合 および-n 出力タイミングをメモします:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1 も機能しますが、行全体を1つの引数として渡すのではなく、行を分割して引数を分離します。