POSIX 确定具有特定 PID 的进程是否存在的合规方式
POSIX compliant way to find out if a process with a certain PID is alive
我从 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 的 'EXIT STATUS' 和 'RATIONALE' 部分中的语句。重点是我加的。
EXIT STATUS
The following exit values shall be returned:
0
At least one matching process was found for each pid operand, and the specified signal was successfully processed for at least one
matching process.
>0
An error occurred.
RATIONALE
...
...
An early proposal invented the name SIGNULL as a signal_name for
signal 0 (used by the System Interfaces volume of POSIX.1-2008 to test
for the existence of a process without sending it a signal). Since the
signal_name 0 can be used in this case unambiguously, SIGNULL has been
removed.
但我一直无法在 POSIX.1-2008.
的系统接口卷中找到对此的提及
对于第二个代码示例,我在 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html 没有发现任何东西,如果 ps -p "$pid"
找不到具有匹配 $pid
的进程,则退出状态将大于零=]命令。
这是我的问题。
- 第一个代码示例真的是一种符合 POSIX 的方式来查明 PID =
$pid
的进程是否确实存在吗?
- 能否请您指向 POSIX.1-2008 系统接口卷中的相应页面和部分,我可以在其中找到记录的信号 0 的行为?
- 第二个代码示例是否符合 POSIX 的方式来查明 PID =
$pid
的进程是否存活?
来自 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
的非零 return 状态意味着 "an error occurred",但 不是 指定没有匹配给定参数的命令是错误的。因此,第二段代码的行为应该被认为是系统特定的。
我从 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 的 'EXIT STATUS' 和 'RATIONALE' 部分中的语句。重点是我加的。
EXIT STATUS
The following exit values shall be returned:
0 At least one matching process was found for each pid operand, and the specified signal was successfully processed for at least one matching process.
>0 An error occurred.
RATIONALE
...
...
An early proposal invented the name SIGNULL as a signal_name for signal 0 (used by the System Interfaces volume of POSIX.1-2008 to test for the existence of a process without sending it a signal). Since the signal_name 0 can be used in this case unambiguously, SIGNULL has been removed.
但我一直无法在 POSIX.1-2008.
的系统接口卷中找到对此的提及对于第二个代码示例,我在 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html 没有发现任何东西,如果 ps -p "$pid"
找不到具有匹配 $pid
的进程,则退出状态将大于零=]命令。
这是我的问题。
- 第一个代码示例真的是一种符合 POSIX 的方式来查明 PID =
$pid
的进程是否确实存在吗? - 能否请您指向 POSIX.1-2008 系统接口卷中的相应页面和部分,我可以在其中找到记录的信号 0 的行为?
- 第二个代码示例是否符合 POSIX 的方式来查明 PID =
$pid
的进程是否存活?
来自 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
的非零 return 状态意味着 "an error occurred",但 不是 指定没有匹配给定参数的命令是错误的。因此,第二段代码的行为应该被认为是系统特定的。