如何用Bash/系统命令监听指定PID进程退出?无对应进程时命令需失败
监听指定PID进程退出的Bash/系统命令方案
当然有可行的命令来搞定这个需求!下面给你两种常用方法,分别适配不同场景:
方法1:用wait命令(仅限当前Shell的子进程)
wait是Bash自带的内置命令,专门用来等待指定PID的进程结束。如果目标PID不存在,或者不是当前Shell启动的子进程,它会直接报错失败,完全符合你的要求。
举个例子:
pid=1234 wait $pid
- 如果
1234是当前Shell的子进程,这个命令会一直阻塞,直到该进程退出,之后返回进程的退出状态码。 - 如果PID不存在,或者根本不是当前Shell的子进程,
wait会立刻报错,比如输出bash: wait: pid 1234 is not a child of this shell,同时返回非0的失败状态码。
方法2:循环检查进程状态(适配任何PID)
要是目标进程不是当前Shell的子进程,wait就不好使了。这时候可以用kill -0配合循环来监听——kill -0不会给进程发任何信号,只是单纯检查进程是否存在。
示例代码:
pid=1234 # 先检查进程是否存在,不存在直接失败退出 if ! kill -0 $pid 2>/dev/null; then echo "Error: 进程$pid不存在" >&2 exit 1 fi # 循环监听,直到进程退出 while kill -0 $pid 2>/dev/null; do sleep 1 # 每隔1秒检查一次,可按需调整间隔 done echo "进程$pid已经退出啦"
- 开头的
kill -0检查会先验证PID是否存在,不存在就直接报错退出,完美匹配你的需求。 - 循环里每隔1秒查一次进程状态,直到进程消失(也就是退出了)。你可以修改
sleep的数值来调整检查频率,比如改成sleep 0.5就是半秒查一次。
小补充
如果你想在进程退出后立刻执行后续命令,直接在上面的命令后面追加即可,比如:
wait $pid && echo "进程结束,开始执行下一个任务..."
或者
while kill -0 $pid 2>/dev/null; do sleep 1; done echo "进程已退出,启动清理工作..."
内容的提问来源于stack exchange,提问作者Alexander Mills




