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


10

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

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

私が必要なのは、実行logs.log中にログを切り取って保存するfoo.shことです。言い換えると、サービスのログの一部が自分とやり取りするときに必要foo.shになります(そのため、foo.shのログは気にしません)。

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

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

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

回答:


12

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

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

$!バックグラウンドで実行するために送信された最後のジョブのPIDをキャプチャします。これにより、waitスクリプトで終了し、不要になっkilltailプロセスを取得できます。


3
素晴らしい答え、今日新たに学んだ何か
ミゲル・モタ

7

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

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

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


個人的には、ジョブ名簿を使用するよりも、明示的なPIDをキャプチャすることを好みます。これは、実装がますます複雑になり、複数のタスクがバックグラウンドに置かれkill %1、間違ったターゲットが取得される可能性があるためです。
DopeGhoti

1
その理由は、サブシェルの括弧を使用したため、%1はサブシェル内の最初のジョブを参照するためです(ただし、すべてのシェルでこれについてはよくわかりません)。あなたのソリューションはより多くのケースでより完全で機能的であることは明らかですが、ユーザーが必要とすることを実行できると思います。
Luciano Andress Martini
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.