我从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_name signal 0 (由POSIX.1-2008 的系统接口卷用于测试 没有发送信号的过程的存在)。自从 在这种情况下,signal_name 0可以毫不含糊地使用,SIGNULL已经 除去。
但是我无法在POSIX.1-2008的系统接口卷中找到这一点。
对于第二个代码示例,我在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html找不到任何内容,如果$pid
找不到匹配ps -p "$pid"
的进程,则可以保证退出状态大于零命令。
以下是我的问题。
$pid
的进程是否确实存在?$pid
的进程是否存活?答案 0 :(得分:1)
来自kill(1p)
手册页:
SYNOPSIS
kill -s signal_name pid ...
kill -l [exit_status]
kill [-signal_name] pid ...
kill [-signal_number] pid ...
...
-signal_number
Specify a non-negative decimal integer, signal_number, repre‐
senting the signal to be used instead of SIGTERM, as the sig
argument in the effective call to kill(). The correspondence
between integer values and the sig value used is shown in the
following table.
The effects of specifying any signal_number other than those listed in
the table are undefined.
signal_number sig Value
0 0
...
...
SEE ALSO
Shell Command Language, ps, wait(), the System Interfaces volume of
IEEE Std 1003.1-2001, kill(), the Base Definitions volume of
IEEE Std 1003.1-2001, <signal.h>
来自kill(3p)
手册页:
SYNOPSIS
#include <signal.h>
int kill(pid_t pid, int sig);
DESCRIPTION
The kill() function shall send a signal to a process or a group of pro‐
cesses specified by pid. The signal to be sent is specified by sig and
is either one from the list given in <signal.h> or 0. If sig is 0 (the
null signal), error checking is performed but no signal is actually
sent. The null signal can be used to check the validity of pid.
...
SEE ALSO
getpid(), raise(), setsid(), sigaction(), sigqueue(), the Base Defini‐
tions volume of IEEE Std 1003.1-2001, <signal.h>, <sys/types.h>
修改强>
是。 POSIX指定信号0将从kill
透明地传递到kill()
以及0的信号。
它位于kill()
function描述的第一段。
POSIX指定ps
的非零返回状态表示“发生错误”,但不指定没有与给定参数匹配的命令是错误。因此,第二段代码的行为应该被视为特定于系统。