Dari StackOverflow post'grep -q' tidak keluar dengan 'tail -f':
tail -f
akan membaca file dan menampilkan baris yang ditambahkan kemudian, itu tidak akan berakhir (kecuali sinyal sepertiSIGTERM
terkirim).grep
bukan bagian pemblokiran di sini,tail -f
adalah.grep
akan membaca dari pipa sampai ditutup, tetapi tidak pernah karenatail -f
tidak keluar dan membiarkan pipa tetap terbuka.Solusi untuk masalah Anda mungkin adalah (belum diuji dan sangat mungkin berkinerja buruk):
tail -f logfile | while read line; do echo $line | grep -q 'find me to quit' && break; done
Anda akan menemukan lebih banyak informasi dan solusi di pos tertaut.
grep
tidak keluar dan pipa hilang, meskipun tail
terus berjalan. Log laporan bug ini dimulai dengan kasus penggunaan yang sangat mirip dengan Anda:
Saya ingin menggunakan
tail
dangrep
untuk mengikuti file sampai pola tertentu muncul. Tapitail
tidak keluar saatgrep
selesai.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxx
Sekarang
tail
masih mencoba membaca dan keluar hanya jika saya menulis lagi ke/tmp/blabla
.Apakah ini yang seharusnya?
Penjelasannya di sana:
tail
tidak keluar di SIGPIPE, namun hanya akan mendapatkan sinyal diwrite()
, jadi Anda perlu mendapatkan lebih banyak data di file sebelumtail
akan keluar.
Sejauh yang saya tahu, mekanisme yang tepat ini sangat umum. Banyak alat keluar setelah mereka mencoba menulis sesuatu ke pipa yang rusak, itu bukan bug.
Kemudian keinginan ini datang:
Itu poin yang adil meskipun
tail
, karena dapat bertahan selamanya harus mengambil langkah-langkah khusus agar responsif terhadap ujung pipa yang lain.
Dan akhirnya:
Diimplementasikan di:
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f
Dan memang, ketika saya mencoba mereproduksi masalah Anda dengan tail
dari GNU coreutils 8.28, saya tidak bisa. Alat segera keluar.