如何在循环中使用tail -f

时间:2016-10-04 12:57:20

标签: bash logging tail

在bash脚本中,我想显示我启动的另一个脚本的输出,该脚本的执行时间非常长,哪个输出(包含一个进度条)被重定向到一个文件。

当我启动的流程仍在运行时,我想到了使用tail -f的想法。

虚拟尝试:

#!/bin/bash
./worker.sh & # will log in LOG file
while [[ $(kill -0 $!) ]]; do # my implementation of ps does not support the -p option
    tail -f LOG
done
...

这不起作用tail“挂起”。

我找到了使用以下方法的解决方法,但我很确定还有另一个更清洁的解决方案:

#!/bin/bash
./worker && pkill tail & # I assumed that worker will always return 0
tail -f LOG
...

所以,我的问题是:在不等待文件完成的情况下显示正在运行的进程的输出的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为您已经以正确的方式完成了这项工作,但您不应该使用&&,因为如果./worker失败,tail进程将永远不会终止。相反,您可以将命令与;分开,如:

#!/bin/bash
./worker ; pkill tail &
tail -f LOG

答案 1 :(得分:1)

我找到了完美回答这个问题:

tail有一个--pid选项:

  --pid=PID
    with -f, terminate after process ID, PID dies

所以脚本如下:

#!/bin/bash
./worker.sh & # will log in LOG file
tail -f --pid=$! LOG

不幸的是,至少我的tail(busybox 1.16.1)实现不支持这个选项,所以我仍然可以解决这个问题。