在运行某个命令期间从一个进程读取日志

在运行某个命令期间从一个进程读取日志

我有一些服务可以在文件中生成日志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在您的脚本上完成,然后在我们不再需要它时处理该过程killtail

答案2

这个版本也可以做到(我认为):

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

请注意,%1 将命中子 shell 中的第一个后台进程

相关内容