shell等待特定进程pid退出的方法

Posted rayylee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell等待特定进程pid退出的方法相关的知识,希望对你有一定的参考价值。

Bash 内置了 wait 命令用于等待进程的退出,并返回其退出码:

wait [-n] [n ...]

Wait for each specified child process and return its termination status.
Each n may be a process ID or a job specification; if a job spec is given, all processes in that job's pipeline are waited for.
If n is not given, all currently active  child  processes  are waited for, and the return status is zero.
If the -n option is supplied, wait waits for any job to terminate and returns its exit status.
If n specifies a non-existent process or job, the return status  is 127.
Otherwise, the return status is the exit status of the last process or job waited for.

但是,从说明来看,wait只能等待当前shell的子进程。如果等待的进程不是当前进程的子进程,则会报告如下错误:

$ wait 1
-bash: wait: pid 1 is not a child of this shell

但是,很多时候我们需要等待任意的进程,那么,wait就不适用了。则需要其他办法。

等待任意进程退出的办法

tail

用法:tail --pid=$pid -f /dev/null

注意:这种方法不适用于 macOS,因为其下的 tail 不支持--pid 参数。但可以用来自 GNU 的 gtail。

哈哈,可能谁也没有想到 tail 竟然还有--pid这个神奇的参数。

tail 的帮助说明:

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

-f, --follow[={name|descriptor}]
    output appended data as the file grows;
    an absent option argument means 'descriptor'

lsof

用法:lsof -p $pid +r 1 &>/dev/null

lsof 用于枚举打开的文件。所以这个命令要求进程有打开文件。哪个进程那么极端会没有打开文件呢?

以上是关于shell等待特定进程pid退出的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux中使用shell脚本杀死进程时获取退出代码=0

进程的控制

Linux --进程控制

Linux进程控制--进程的等待与替换

Linux进程控制

Linux进程控制--进程的等待与替换