10 我有一些服务可以在文件中生成日志logs.log。 我还有一些与此服务交互的命令。可以说是一些foo.sh。 我需要的是logs.log准确地在foo.sh运行期间剪切并保存日志。换句话说,当服务与我的服务交互时,我需要该服务的那部分日志foo.sh(因此我不在乎foo.sh的日志)。 我希望此命令能够解决问题,但是在foo.sh完成后它将继续读取文件: > foo.sh | tail -f logs.log > foo_part.log 有什么好方法可以执行此技巧吗? bash tail — 安德鲁莫尼 source
12 通过将您的后台进程发送到后台,这变得相当简单: foo.sh & mypid=$! tail -f /path/to/logs.log > /path/to/partial.log & tailpid=$! wait $mypid kill -TERM $tailpid $!捕获发送到后台运行的最后一个作业的PID,因此我们可以wait在您的脚本上完成,然后kill在tail不再需要时执行该过程。 — 兴奋剂 source 3 很棒的答案,今天学到了一些新东西 — Miguel Mota,
7 这个版本也可以做到(我认为): ( tail -f logs.log >foo_part.log & foo.sh& wait $! && kill %1 ) 请注意,%1将命中子外壳中的第一个后台进程 — 卢西亚诺·安德列斯·马蒂尼(Luciano Andress Martini) source 就我个人而言,我更喜欢捕获显式PID,而不是使用作业名册,因为对此的日益复杂的实现可能会将多个任务置于后台,并且kill %1可能会得到错误的目标。 — DopeGhoti 1 因为那是我使用的subshell括号,所以%1将引用subshell内的第一个作业(但是我不确定所有shell都可以这样做)。显然,您的解决方案在更多情况下更完整,更实用,但是我认为它可以满足用户的需求……。另一个问题是,我的版本至少需要触摸创建foo_part.log,而您的版本则不需要。 — Luciano Andress Martini