Bash:跟踪日志文件时等待进程退出
在bash脚本中,我使用wait等待子进程的pid。该子进程正在写入日志文件。bash脚本中是否有一种方法可以在等待进程完成的同时将日志文件拖出std?在后台运行cat:Bash:跟踪日志文件时等待进程退出,bash,Bash,在bash脚本中,我使用wait等待子进程的pid。该子进程正在写入日志文件。bash脚本中是否有一种方法可以在等待进程完成的同时将日志文件拖出std?在后台运行cat: cmd-that-logs-to-file & pid=$! cat file & wait $pid kill $! # Kill the cat 在后台运行cat: cmd-that-logs-to-file & pid=$! cat file & wait $pid kill $!
cmd-that-logs-to-file &
pid=$!
cat file &
wait $pid
kill $! # Kill the cat
在后台运行cat:
cmd-that-logs-to-file &
pid=$!
cat file &
wait $pid
kill $! # Kill the cat
在等待命令完成时,使用
tail
命令跟踪文件
command &
cmdpid=$!
tail -f -n +0 logfile &
wait $cmdpid
kill $!
这在精神上类似于William的解决方案,但有一个重要的区别:如果
command
完成的时间比cat
打印文件的时间长(很可能是因为cat
非常快),那么它将正确打印日志文件。-n+0
选项告诉tail
在更新开始之前打印整个文件。在等待命令完成时,使用tail
命令跟踪文件
command &
cmdpid=$!
tail -f -n +0 logfile &
wait $cmdpid
kill $!
这在精神上类似于William的解决方案,但有一个重要的区别:如果command
完成的时间比cat
打印文件的时间长(很可能是因为cat
非常快),那么它将正确打印日志文件。-n+0
选项告诉tail
在开始以下更新之前打印整个文件。这使它更简单:
command &
pid=$!
tail --pid=$pid -f /path/to/log
这使它更简单:
command &
pid=$!
tail --pid=$pid -f /path/to/log
如果在
pid=$之前启动了其他后台进程该怎么办
和在登录到文件&?@KingsIndian的cmd之后,如果您没有记录pid,则无法可靠地等待特定进程。$
提供了最新的后台进程id,可能是其他的。@Kingsindian我不明白你的意思。是的,如果您未能录制$!启动后台进程之后,您就没有该进程的pid。这有什么关系?@kingsindian$!实际上指的是当前shell中的最后一个进程id,而不是整个系统,因此这里确实没有争用条件。文档可能看起来有点不清楚。但除此之外,$!这是没有用的,因为像您询问的那样的竞争条件可能总是会发生如果在pid=$之前启动了其他后台进程会怎么样
和在登录到文件&
?@KingsIndian的cmd之后,如果您没有记录pid,则无法可靠地等待特定进程。$
提供了最新的后台进程id,可能是其他的。@Kingsindian我不明白你的意思。是的,如果您未能录制$!启动后台进程之后,您就没有该进程的pid。这有什么关系?@kingsindian$!实际上指的是当前shell中的最后一个进程id,而不是整个系统,因此这里确实没有争用条件。文档可能看起来有点不清楚。但除此之外,$!不会有用的,因为像你问的那样的比赛条件总是会发生的