Bash 如何在循环中使用tail-f
在bash脚本中,我想显示我启动的另一个脚本的输出,该脚本执行时间很长,并且包含进度条的输出被重定向到文件 我的想法是在启动的进程仍在运行时使用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 ...
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\谢谢,它工作得很好。你可以合并我们的答案和你的评论,这样我就可以接受你的答案了吗?