ファイルlogs.log
にログを生成するサービスがあります。
このサービスと対話する他のコマンドがあります。 foo.sh
だとしましょう。
私が必要なのは、logs.log
の実行中にfoo.sh
からログをカットして保存することです。言い換えると、サービスがfoo.sh
と対話するときに、サービスのログのその部分が必要です(したがって、foo.sh
のログは気にしません)。
このコマンドでうまくいくと思いますが、foo.sh
がすでに終了している場合は、ファイルの読み取りを続行します。
> foo.sh | tail -f logs.log > foo_part.log
このトリックを実行する良い方法はありますか?
これは、バックグラウンドプロセスをバックグラウンドに送信することで、かなり簡単になります。
foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid
$!
は、バックグラウンドで実行するために送信された最後のジョブのPIDをキャプチャします。そのため、スクリプトでwait
を完了し、kill
tail
プロセスがない場合は長くそれが必要です。
このバージョンもそれを行うことができます(私は思う):
( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 )
%1はサブシェルの最初のバックグラウンドプロセスにヒットすることに注意してください