符合POSIX的方法,以确定具有特定PID的进程是否存活

时间:2015-03-07 16:18:54

标签: shell process posix

我从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"的进程,则可以保证退出状态大于零命令。

以下是我的问题。

  1. 第一个代码示例是否真的符合POSIX标准,以确定PID = $pid的进程是否确实存在?
  2. 您能否指点我在​​POSIX.1-2008的系统界面卷中的相应页面和部分,在那里我可以找到记录信号0的行为?
  3. 第二个代码示例是否符合POSIX标准,以确定PID = $pid的进程是否存活?

1 个答案:

答案 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>

修改

  1. 是。 POSIX指定信号0将从kill透明地传递到kill()以及0的信号。

  2. 它位于kill() function描述的第一段。

  3. POSIX指定ps的非零返回状态表示“发生错误”,但指定没有与给定参数匹配的命令是错误。因此,第二段代码的行为应该被视为特定于系统。