Dari StackOverflow post'grep -q' tidak keluar dengan 'tail -f':
tail -fakan membaca file dan menampilkan baris yang ditambahkan kemudian, itu tidak akan berakhir (kecuali sinyal sepertiSIGTERMterkirim).grepbukan bagian pemblokiran di sini,tail -fadalah.grepakan membaca dari pipa sampai ditutup, tetapi tidak pernah karenatail -ftidak 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
taildangrepuntuk mengikuti file sampai pola tertentu muncul. Tapitailtidak keluar saatgrepselesai.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxxSekarang
tailmasih mencoba membaca dan keluar hanya jika saya menulis lagi ke/tmp/blabla.Apakah ini yang seharusnya?
Penjelasannya di sana:
tailtidak keluar di SIGPIPE, namun hanya akan mendapatkan sinyal diwrite(), jadi Anda perlu mendapatkan lebih banyak data di file sebelumtailakan 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.