Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在循环中使用tail-f_Bash_Logging_Tail - Fatal编程技术网

Bash 如何在循环中使用tail-f

Bash 如何在循环中使用tail-f,bash,logging,tail,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 ...

在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
...


因此,我的问题是:在不等待文件完成的情况下,在文件中显示正在运行的进程日志的输出的最佳方式是什么?

我认为您这样做是正确的,只是您不应该使用
&&
,因为如果
/worker
失败,那么
尾部
进程将永远不会终止。相反,您可以使用
分隔命令,如中所示:

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

我认为您的做法是正确的,只是您不应该使用
&&
,因为如果
/worker
失败,那么
tail
过程将永远不会终止。相反,您可以使用
分隔命令,如中所示:

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

我找到了最完美的答案:

tail
有一个--pid选项:

因此,脚本如下所示:

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

不幸的是,至少我的tail实现(busybox 1.16.1)不支持此选项,因此我仍然愿意采取变通办法。

我找到了完美的答案:

tail
有一个--pid选项:

因此,脚本如下所示:

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

不幸的是,至少我的tail实现(busybox 1.16.1)不支持此选项,因此我仍然可以采取变通办法。

在循环中运行
tail-f
的目的是什么?当使用
-f
标记时,
tail
命令将在文件更新时继续显示。事实上,在循环中运行
tail-f
的目的是什么?当使用
-f
标记时,
tail
命令将在文件更新时继续显示。事实上,我目前使用的是
(/worker;pkill tail)&
,这是一个愚蠢的想法。不幸的是,我不能接受你的回答,因为我真的相信
--pid
更适合(如果在执行worker期间,另一个进程开始使用
tail
?)会发生什么情况)谢谢你的帮助,我目前正在按照你的建议使用
(/worker;pkill tail)&
。不幸的是,我不能接受你的回答,因为我真的认为
--pid
更适合(如果在worker执行期间,另一个进程开始使用
tail
?),那会发生什么情况呢)谢谢你的帮助如何:1)获得/worker的pid 1。2) 在后台运行
tail-f
,并获取其PID2。3) 使用
wait
等待工作人员完成。4)
kill
@this.lau\谢谢,它工作得很好。你可以合并我们的答案和你的评论,这样我就可以接受你的答案了吗?如何:1)获得/worker的PID1。2) 在后台运行
tail-f
,并获取其PID2。3) 使用
wait
等待工作人员完成。4)
kill
@this.lau\谢谢,它工作得很好。你可以合并我们的答案和你的评论,这样我就可以接受你的答案了吗?