【发布时间】:2015-03-07 16:18:54
【问题描述】:
我从https://serverfault.com/q/366474 了解到,以下代码是一种符合 POSIX 标准的方法,用于测试 PID = $pid 的进程是否处于活动状态。它使用kill -0 命令。
# First code sample
pid=100
if kill -0 "$pid" 2> /dev/null
then
echo PID "$pid" is alive.
else
echo PID "$pid" not found.
fi
pid=100
我学到的另一种方法是使用ps -p 命令。
# Second code sample
if ps -p "$pid" > /dev/null
then
echo PID "$pid" is alive.
else
echo PID "$pid" not found.
fi
我一直试图弄清楚使用kill -0 命令的第一个代码示例是否确实符合 POSIX。我发现最接近它的是http://pubs.opengroup.org/onlinepubs/9699919799/utilities/kill.html 的“退出状态”和“基本原理”部分中的陈述。重点是我加的。
退出状态
应返回以下退出值:
0 为每个pid操作数找到至少一个匹配的进程,并且指定的信号被成功处理了至少一个 匹配过程。
>0 发生错误。
基本原理
...
...
早期的提议发明了名称 SIGNULL 作为信号名称 signal 0(由 POSIX.1-2008 的系统接口卷使用测试 为一个进程的存在而不向它发送信号)。由于 signal_name 0 在这种情况下可以明确使用,SIGNULL 已经 删除。
但我在 POSIX.1-2008 的系统接口卷中找不到提及这一点。
对于第二个代码示例,我在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html 上没有发现任何东西可以保证如果$pid 命令没有找到具有匹配$pid 的进程,则退出状态将大于零。
这是我的问题。
- 第一个代码示例真的是一种符合 POSIX 标准的方式来确定 PID =
$pid的进程是否确实存在? - 能否请您指向 POSIX.1-2008 系统接口卷中的相应页面和部分,我可以在其中找到记录的信号 0 的行为?
- 第二个代码示例是否是一种符合 POSIX 标准的方式来确定 PID =
$pid的进程是否处于活动状态?
【问题讨论】:
-
你引用了授权它的文本。你不会从标准中得到任何更明确的东西。注意
kill -0 pid即使进程存在也可能失败;它只是意味着您,用户名mortal,不能向具有该 PID 的进程发送信号,因为该进程属于deity。因此,在其限制范围内,它由标准中定义的行为来保证。如果命令失败,你只知道你不能向进程发送信号,但这可能是因为它不存在,也可能是因为你不被允许向它发出信号。