Bagi mereka yang memiliki program yang terus menulis ke stdout, semua yang perlu Anda lakukan adalah pipa untuk menangkap dengan opsi 'pertandingan tunggal'. Setelah grep menemukan string yang cocok, itu akan keluar, yang menutup stdout pada proses yang sedang disalurkan ke grep. Acara ini secara alami harus menyebabkan program untuk keluar dengan anggun selama proses menulis lagi .
Apa yang akan terjadi adalah bahwa proses akan menerima SIGPIPE ketika mencoba menulis ke stdout tertutup setelah grep keluar. Berikut ini adalah contoh dengan ping, yang sebaliknya akan berjalan tanpa batas:
$ ping superuser.com | grep -m 1 "icmp_seq"
Perintah ini akan cocok dengan 'pong' pertama yang berhasil, dan kemudian keluar saat berikutnya ping
mencoba menulis ke stdout.
Namun,
Tidak selalu dijamin bahwa proses akan menulis ke stdout lagi dan karena itu mungkin tidak menyebabkan SIGPIPE dinaikkan (misalnya, ini bisa terjadi ketika tailing file log). Solusi terbaik yang berhasil saya buat untuk skenario ini melibatkan penulisan ke file; beri komentar jika Anda pikir Anda dapat meningkatkan:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
Hancurkan ini:
tail -f log_file & echo $! > pid
- mengekor file, melampirkan proses ke latar belakang, dan menyimpan PID ( $!
) ke file. Saya mencoba mengekspor PID ke variabel, tetapi sepertinya ada kondisi ras antara sini dan ketika PID digunakan lagi.
{ ... ;}
- kelompokkan perintah-perintah ini bersama-sama sehingga kita dapat menyalurkan output ke grep sambil menjaga konteks saat ini (membantu ketika menyimpan dan menggunakan kembali variabel, tetapi tidak dapat membuat bagian itu berfungsi)
|
- pipa sisi kiri stdout ke sisi kanan stdin
grep -m1 "find_me"
- temukan string target
&& kill -9 $(cat pid)
- force kill (SIGKILL) tail
proses setelah grep
keluar setelah menemukan string yang cocok
&& rm pid
- hapus file yang kami buat
tail -f
keluaran program sama seperti file ... Apakah saya salah?