ファイルにログを生成するサービスがありますlogs.log
。
このサービスと対話する他のコマンドがあります。それが一部だとしますfoo.sh
。
私にとって必要なのは、logs.log
実行中にログを正しく切り取って保存することです。foo.sh
つまり、サービスが私とやり取りするときにサービスログのこの部分が必要です(ログfoo.sh
は気にしません)。foo.sh
このコマンドはうまくいくことを望みましたが、操作がfoo.sh
完了した後でもファイルを読み続けます。
> foo.sh | tail -f logs.log > foo_part.log
このトリックを実行する良い方法はありますか?
答え1
これは、バックグラウンドプロセスをバックグラウンドに送信すると非常に簡単になります。
foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid
$!
バックグラウンドで実行されるように送信された最後のジョブのPIDをキャプチャしてwait
スクリプトで実行し、不要になったときにプロセスを破棄しますkill
。tail
答え2
このバージョンも可能です。 (私の考えでは):
( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 )
%1はサブシェルの最初のバックグラウンドプロセスに到達します。