在Bash中检查PID是否存在

30

我想要在我的BASH脚本中延迟执行,直到一个进程关闭(我已经将PID存储在一个变量中)。我在思考

while [PID IS RUNNING]; do
sleep 500
done

我看到的大多数示例都使用/dev/null,似乎需要root权限。有没有不需要root权限就能做到这一点的方法?

非常感谢您的帮助!


3
请查看 https://dev59.com/-XRC5IYBdhLWcg3wROtQ 。 - atk
3
请参阅进程管理。你能否展示一个需要root权限才能使用/dev/null的例子?我无法想象这种情况可能是什么或者它如何适用于这个案例。请参考进程管理页面。你能否展示一个需要root权限才能使用/dev/null的例子?我无法想象在这种情况下它可能被如何应用或有何作用。 - Dennis Williamson
有什么使用 /dev/null 需要 root 权限吗?我想不出来。 - ndemou
5个回答

40

kill -s 0 $pid 如果进程$pid正在运行,则返回成功,否则返回失败,而不会向进程发送信号,因此您可以直接在if语句中使用它。

wait $pid 将等待该进程完成,取代了你整个循环。


1
谢谢。这是我的当前代码:while sleep 1; do kill -0 $PIDD || break; done - JohnP
11
注意:kill -0 $pid 仅适用于您拥有的进程。ps -p $pid 适用于任何进程。 - sligocki
4
注意:wait $pid 只在你是 $pid 的父进程时起作用。 - Harish

26

看起来你想要

wait $pid

$pid完成时,将返回结果。

否则,你可以使用

ps -p $pid

为了检查进程是否仍然存在(这比kill -0 $pid更有效,因为它可以在您不拥有该pid的情况下工作)。


1
注意:wait 仅在 $pid 是 shell 的子进程时才起作用。在这些情况下,这可能经常发生,但并非总是如此。 - Peter Eisentraut
1
wait is not useful when scripting. If the goal is to quickly determine if a pid exists, then do something, wait would have be be bg which is inefficient. The second solution is better. Include removing the header and its usable: ps -p $pid | tail -n +2 - Dave
Dave:这个问题字面上说:“我想要在我的BASH脚本中暂停执行,直到一个进程关闭”,这正是wait所做的。wait在脚本中完全可用,我已经使用过很多次!它只取决于你的用例。 - sligocki

10
你可以查看/proc/YOUR_PID目录是否存在,来判断是否有相关进程。

2
如果您只在Linux上运行脚本,那就没问题。为了确保兼容性,最好使用上面提供的kill -s技巧。 - Zouppen
在我的测试中,我发现在进程死亡后,目录会在短时间内挂起。 - Bryan

8

ps --pid $pid &>/dev/null

如果进程存在,返回0,否则返回1。


ps命令的--pid选项在你的操作系统中可能有效,但在我的系统中却不起作用。原帖中提到了他使用的操作系统吗?如果没有,你应该在提供特定于操作系统且不可移植的答案时进行说明。 - ghoti

3
我通常使用以下命令:tail -f /dev/null --pid $PID。它不需要显式循环,并且不仅限于您的shell子进程pid。

FreeBSD和OSX上的tail命令不包括--pid选项。如果OP没有询问特定的操作系统,您应该限定任何平台特定的答案。 - ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接