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

And*_*niy 10 bash tail

我有一些在文件中生成日志的服务logs.log

我还有一些与此服务交互的其他命令。让我们说它是一些foo.sh

我需要的是logs.logfoo.sh运行期间准确地剪切和保存日志。换句话说,当它与我的交互时,我需要那部分服务的日志foo.sh(所以我不关心foo.sh的日志)。

我希望这个命令可以解决问题,但它会在foo.sh已经完成后继续读取文件:

> foo.sh | tail -f logs.log > foo_part.log
Run Code Online (Sandbox Code Playgroud)

有什么好方法来执行这个技巧吗?

Dop*_*oti 12

通过将您的后台进程发送到后台,这变得相当简单:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid
Run Code Online (Sandbox Code Playgroud)

$!捕获的最后一个作业的PID发送到在后台运行,所以我们可以wait在你的脚本来完成,然后killtail过程中,当我们不再需要它。

  • 很棒的答案,今天学到了一些新东西 (3认同)

Luc*_*ini 7

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

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 
Run Code Online (Sandbox Code Playgroud)

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