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


10

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

我还有一些与此服务交互的命令。可以说是一些foo.sh

我需要的是logs.log准确地在foo.sh运行期间剪切并保存日志。换句话说,当服务与我的服务交互时,我需要该服务的那部分日志foo.sh(因此我不在乎foo.sh的日志)。

我希望此命令能够解决问题,但是在foo.sh完成后它将继续读取文件:

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

有什么好方法可以执行此技巧吗?

Answers:


12

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

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

$!捕获发送到后台运行的最后一个作业的PID,因此我们可以wait在您的脚本上完成,然后killtail不再需要时执行该过程。


3
很棒的答案,今天学到了一些新东西
Miguel Mota,

7

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

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

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


就我个人而言,我更喜欢捕获显式PID,而不是使用作业名册,因为对此的日益复杂的实现可能会将多个任务置于后台,并且kill %1可能会得到错误的目标。
DopeGhoti

1
因为那是我使用的subshel​​l括号,所以%1将引用subshel​​l内的第一个作业(但是我不确定所有shell都可以这样做)。显然,您的解决方案在更多情况下更完整,更实用,但是我认为它可以满足用户的需求……。另一个问题是,我的版本至少需要触摸创建foo_part.log,而您的版本则不需要。
Luciano Andress Martini
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.