Quiero tail -f /var/log/syslog | grep
con el patrón "arpwatch" y enviarme cada línea a mí mismo a través de jabber:xmpp [email protected]
usando xargs
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
no funciona.
pero tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
funciona bien.
Creo que es algo fundamental sobre xargs
y tail -f
que no entiendo.
Respuesta aceptada:
xargs command
intenta recopilar tantos elementos de entrada (líneas, palabras) como pueda para una invocación del comando , y no le importa particularmente la sincronización de los datos de entrada. Si la tail
el proceso se mata, o xargs
el búfer se llena, ejecutará comando con los argumentos que recibió para entonces. Sin embargo, tail -f
por lo general, no termina solo y el límite para los argumentos de la línea de comandos puede ser grande, por lo que parece que no funciona en absoluto.
Podrías usar xargs -n1
para que pase solo un elemento de entrada a la vez para comando , pero te sorprenderá el hecho de que xargs
usa espacios en blanco para dividir la entrada en elementos, por lo que una línea de entrada de foo bar
haría que el comando se ejecutara dos veces.
Con GNU xargs, xargs -n1 -d '\n'
deberías hacer lo que quieras:ejecutar comando una vez por cada línea de entrada, pasando la línea completa como único argumento.
Pruebe, p. con y sin -d
y -n
y tome nota del tiempo de salida:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
también funcionaría, pero aun así dividirá la línea en argumentos separados, en lugar de pasar la línea completa como un solo argumento.