Chci tail -f /var/log/syslog | grep
se vzorem „arpwatch“ a posílat každý řádek sobě přes jabber:xmpp [email protected]
pomocí xargs
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
nefunguje.
ale tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
funguje dobře.
Myslím, že je to základní věc o xargs
a tail -f
že tomu nerozumím.
Přijatá odpověď:
xargs command
se snaží shromáždit co nejvíce vstupních položek (řádků, slov), kolik je možné do jednoho vyvolání příkazu a nijak zvlášť se nestará o načasování vstupních dat. Pokud tail
proces je zabit nebo xargs
Pokud se vyrovnávací paměť zaplní, spustí se příkaz s argumenty, které do té doby obdržel. Nicméně tail -f
obvykle nedokončí sám a limit pro argumenty příkazového řádku může být velký, takže se zdá, že to vůbec nefunguje.
Můžete použít xargs -n1
aby předal vždy pouze jednu vstupní položku k příkazu , ale zasáhne vás skutečnost, že xargs
používá mezery k rozdělení vstupu na položky, takže vstupní řádek foo bar
způsobí, že se příkaz spustí dvakrát.
S GNU xargs, xargs -n1 -d '\n'
by měl dělat, co chcete:spustit příkaz jednou pro každý vstupní řádek, přičemž celý řádek je předán jako jeden argument.
Zkuste např. s a bez -d
a -n
a poznamenejte si časování výstupu:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
by také fungovalo, ale stále to rozdělí řádek na samostatné argumenty, místo aby celý řádek předal jako jeden argument.