Baca log dari satu proses selama menjalankan beberapa perintah

10

Saya memiliki beberapa layanan yang menghasilkan log dalam file logs.log.

Saya memiliki beberapa perintah lain yang berinteraksi dengan layanan ini. Katakanlah beberapa foo.sh.

Yang saya butuhkan adalah memotong dan menyimpan log dari logs.logsaat foo.shmenjalankan. Dengan kata lain saya memerlukan bagian dari log layanan ketika berinteraksi dengan log saya foo.sh(jadi saya tidak peduli tentang foo.shlog).

Saya berharap bahwa perintah ini akan melakukan trik, tetapi terus membaca file ketika foo.shsudah selesai:

> foo.sh | tail -f logs.log > foo_part.log

Apakah ada cara yang baik untuk melakukan trik ini?

Andremoniy
sumber

Jawaban:

12

Ini dibuat agak mudah dengan mengirimkan proses latar belakang Anda ke, well, latar belakang:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!menangkap PID dari pekerjaan terakhir dikirim ke berjalan di latar belakang, sehingga kami dapat waitpada script Anda sampai akhir, dan kemudian killyang tailproses ketika kita tidak lagi membutuhkannya.

DopeGhoti
sumber
3
jawaban yang luar biasa, pelajari sesuatu yang baru hari ini
Miguel Mota
7

Versi ini juga dapat melakukannya (saya pikir):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

Perhatikan bahwa% 1 akan menekan proses latar belakang pertama di subkulit

Luciano Andress Martini
sumber
Secara pribadi, saya lebih suka untuk menangkap PID eksplisit daripada menggunakan daftar pekerjaan, karena implementasi yang semakin kompleks ini mungkin menempatkan lebih dari satu tugas di latar belakang dan kill %1mungkin mendapatkan target yang salah.
DopeGhoti
1
Karena itu saya menggunakan tanda kurung subshell sehingga% 1 akan merujuk ke pekerjaan pertama di dalam subkulit (tapi saya tidak begitu yakin tentang ini untuk semua shell). Jelas solusi Anda lebih lengkap dan fungsional untuk lebih banyak kasus, tetapi saya pikir itu bisa melakukan apa yang dibutuhkan pengguna .... Masalah lain adalah bahwa versi saya membutuhkan setidaknya pembuatan foo_part.log dengan sentuhan, versi Anda tidak.
Luciano Andress Martini