You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动