web-dev-qa-db-ja.com

コマンドの実行中に1つのプロセスからログを読み取る

ファイルlogs.logにログを生成するサービスがあります。

このサービスと対話する他のコマンドがあります。 foo.shだとしましょう。

私が必要なのは、logs.logの実行中にfoo.shからログをカットして保存することです。言い換えると、サービスがfoo.shと対話するときに、サービスのログのその部分が必要です(したがって、foo.shのログは気にしません)。

このコマンドでうまくいくと思いますが、foo.shがすでに終了している場合は、ファイルの読み取りを続行します。

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

このトリックを実行する良い方法はありますか?

10
Andremoniy

これは、バックグラウンドプロセスをバックグラウンドに送信することで、かなり簡単になります。

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

$!は、バックグラウンドで実行するために送信された最後のジョブのPIDをキャプチャします。そのため、スクリプトでwaitを完了し、killtailプロセスがない場合は長くそれが必要です。

12
DopeGhoti

このバージョンもそれを行うことができます(私は思う):

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

%1はサブシェルの最初のバックグラウンドプロセスにヒットすることに注意してください