Saya ingin tail -f /var/log/syslog | grep
dengan pola “arpwatch” dan mengirim setiap baris ke diri saya sendiri melalui jabber:xmpp [email protected]
menggunakan xargs
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
tidak bekerja.
tapi tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
bekerja dengan baik.
Saya pikir ini adalah hal mendasar tentang xargs
dan tail -f
yang tidak saya mengerti.
Jawaban yang Diterima:
xargs command
mencoba mengumpulkan sebanyak mungkin item input (baris, kata) untuk satu pemanggilan perintah , dan itu tidak terlalu peduli dengan waktu input data. Jika tail
proses dimatikan, atau xargs
s buffer terisi, itu akan menjalankan command dengan argumen yang diterimanya saat itu. Namun, tail -f
biasanya tidak selesai dengan sendirinya, dan batas argumen baris perintah bisa besar, jadi sepertinya tidak berfungsi sama sekali.
Anda dapat menggunakan xargs -n1
untuk membuatnya hanya melewati satu item input pada satu waktu ke command , tetapi Anda akan terkejut dengan fakta bahwa xargs
menggunakan spasi putih untuk membagi input menjadi item, jadi baris input foo bar
akan menyebabkan perintah dijalankan dua kali.
Dengan GNU xargs, xargs -n1 -d '\n'
harus melakukan apa yang Anda inginkan:jalankan perintah sekali untuk setiap baris input, dengan baris penuh dilewatkan sebagai argumen tunggal.
Coba, mis. dengan dan tanpa -d
dan -n
dan catat waktu keluaran:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
juga akan berfungsi, tetapi tetap akan membagi baris menjadi argumen yang terpisah, alih-alih meneruskan seluruh baris sebagai satu argumen.