GNU/Linux >> Belajar Linux >  >> Linux

Mengapa bukan `tail -f … | grep -q …` berhenti ketika menemukan kecocokan?

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 seperti SIGTERM terkirim). grep bukan bagian pemblokiran di sini, tail -f adalah. grep akan membaca dari pipa sampai ditutup, tetapi tidak pernah karena tail -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 dan grep untuk mengikuti file sampai pola tertentu muncul. Tapi tail tidak keluar saat grep 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 di write() , jadi Anda perlu mendapatkan lebih banyak data di file sebelum tail 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.


Linux
  1. Bagaimana Menjalankan Grep Dengan Banyak Dan Pola?

  2. Mengapa [a-z] Mencocokkan Huruf Kecil Di Bash?

  3. Mengapa Seseorang Dapat Menambahkan ~/.profile Ke ~/.bash_profile?

  1. Grep Dan Ekor -f?

  2. Grep -e, Sed -e – Performa Rendah Saat '[x]{1,9999}' Digunakan, Tapi Mengapa?

  3. Tidakkah `tail -f` Mengikuti Syslog Saat Menjalankan Live?

  1. Mengapa keluar kode 141 dengan grep -q?

  2. mengapa saya tidak bisa mencocokkan sekejap dengan uptime?

  3. Mengapa LXC ketika ada linux-vserver?