Saya mencari cara untuk secara sistematis menonton output dari suatu perintah sampai string tertentu diamati dan kemudian keluar. Ini sangat mirip dengan pertanyaan ini , tetapi alih-alih membuntuti file, saya ingin 'membuntuti' sebuah perintah.
Sesuatu seperti:
tonton -n1 my_cmd | grep -m 1 "String Im Looking For"
(Tapi ini tidak berhasil untukku.)
UPDATE: Saya perlu mengklarifikasi bahwa 'my_cmd' tidak terus-menerus menampilkan teks tetapi perlu berulang kali dipanggil sampai string ditemukan (itulah sebabnya saya memikirkan perintah 'watch'). Dalam hal ini, 'my_cmd' seperti banyak perintah unix lainnya seperti: ps, ls, lsof, last, dll.
tail -f
keluaran program sama seperti file ... Apakah saya salah?Jawaban:
Gunakan satu lingkaran:
Alih-alih
:
, Anda dapat menggunakansleep 1
(atau 0,2) untuk mempermudah CPU.Loop berjalan sampai grep menemukan string di output perintah.
-m 1
berarti "satu kecocokan sudah cukup", yaitu grep berhenti mencari setelah menemukan kecocokan pertama.Anda juga dapat menggunakan
grep -q
yang juga berhenti setelah menemukan kecocokan pertama, tetapi tanpa mencetak baris yang cocok.sumber
grep -q
opsi lain. grep berhenti setelah menemukan string.!
meniadakan kode keluar dari pipa perintahgrep -m 1
keluar ketika string ditemukanwatch -e
kembali jika ada kesalahan yang terjadiTapi ini bisa ditingkatkan untuk benar-benar menampilkan garis yang cocok, yang dibuang sejauh ini.
sumber
watch
Perintah saya (CentOS) tidak memiliki-e
bendera (yang seharusnya tidak terlalu penting). Lebih penting lagi, ketika senar ditemukan, arloji terus berjalan dan tidak keluar. Tampaknya saatgrep -m
keluar, ia hanya keluar membunuhmy_cmd
, tetapi tidakwatch
.tee
untuk itu, tetapi ini memperkenalkan baris baru yang menyesatkan, saya tidak tahu bagaimana cara mengelak sekarang:watch -n1 -e "! date | tee /dev/tty | grep --color -m 1 \"17\""
watch
patuh berhenti menonton ketika string ditemukan, tetapi itu tidak benar-benar keluar sampai Anda menekan tombol. Sangat dekat.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:
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:
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 stdingrep -m1 "find_me"
- temukan string target&& kill -9 $(cat pid)
- force kill (SIGKILL)tail
proses setelahgrep
keluar setelah menemukan string yang cocok&& rm pid
- hapus file yang kami buatsumber
Jika
tail
tidak mendukung+1f
sintaks, cobatail -f -n +1
. (The-n +1
menyuruhnya untuk memulai di awal;tail -f
secara default dimulai dengan 10 baris terakhir output.)sumber
Tambahkan hasil panggilan program Anda ke file. Lalu
tail -f
file itu. Dengan begitu itu seharusnya bekerja ... Saya harap.Ketika Anda memulai kembali panggilan program itu, Anda harus menghapus file atau menambahkan omong kosong hanya agar tidak cocok lagi dengan apa yang Anda cari.
sumber