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:跟踪日志文件时等待进程退出_Bash - Fatal编程技术网

Bash:跟踪日志文件时等待进程退出

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 $!

在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 $!  # 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,而不是整个系统,因此这里确实没有争用条件。文档可能看起来有点不清楚。但除此之外,$!不会有用的,因为像你问的那样的比赛条件总是会发生的