GNU/Linux >> Znalost Linux >  >> Linux

Proč Xargs nemůže pracovat s Tail -f?

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.


Linux
  1. Obnovuji své vzrušení z práce s Ansible

  2. Vykonat řadu příkazů jedním sudem?

  3. Proč substituce procesu Bash nefunguje s některými příkazy?

  1. Počítání znaků každého řádku s Wc?

  2. Proč Lsdel v Debugfs nefunguje?

  3. Proč nemohu použít CD ve skriptu Bash?

  1. Barvení výstupu ocasu pomocí Sed?

  2. Nemůžete najít soubor k opravě na vstupním řádku 3?

  3. Proč se mohu přihlásit pomocí částečných hesel?