Shell 脚本中的‘ kill-0 $pid’是做什么的?

基本上,’0’代表什么信号,因为 给你我看到信号数字从1开始。

63611 次浏览

此命令检查 $PID 中的 PID 进程是否存在。

发送信号 0给给定的 PID只是检查是否有任何进程与给定的 PID正在运行,你有权限发送一个信号给它。

有关详细信息,请参阅以下手册:

杀死(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
杀死(2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this
can be used to check for the existence of a process ID or process group ID.
...

这是个好问题,因为..。

很难找到关于这个特殊信号的文件。不管其他人怎么说,在基于 Debian 系统的 man 1 kill中只提到了这个信号:

特别有用的信号包括 HUP、 INT、 KILL、 STOP、 CONT 和0。

不是特别有帮助,特别是如果你还不知道信号的作用。它也没有被 kill -l的输出列出,所以除非您已经知道它,否则不会知道它。

在哪里可以找到它的文档

在 Debian 和 Ubuntu 系统上,man 2 kill的输出部分说明:

如果 sig 为0,则不发送任何信号,但仍然执行错误检查; 这可用于检查是否存在进程 ID 或进程组 ID。

它的好处

可以使用 kill -0检查进程是否正在运行。

# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid


# Check if a PID exists. When missing, this should result
# in output similar to:
#    bash: kill: (6228) - No such process
#    Exit status: 1
kill -0 $pid; echo "Exit status: $?"

您还可以使用 kill -0来确定当前用户是否具有向给定进程发送信号的权限。例如:

# See if you have permission to signal the process. If not,
# this should result in output similar to:
#     bash: kill: (15764) - Operation not permitted
#     Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"

kill -0 $pid用于检查进程 id (pid)的进程是否存在。

使用 kill -0 $pid检查进程是否存在时要小心,因为

  1. 一旦预期的进程退出,它的 pid 就可以分配给其他新创建的进程。(因此,人们不能确定某个特定过程是否存在)

  2. 对于僵尸进程,其子进程正在等待父进程调用 wait。在这里,它保存 $pid 并在进程不运行时给出正结果。

kill -0 $pid用于检查使用 $pid运行的进程是否处于活动状态。但是这可能很棘手,因为一旦流程退出和新流程运行,就可以重新分配流程 ID。

可以使用 killall -0 <process name>了解某个特定进程是否正在运行。

向进程发送 EXIT信号或 0将:

  1. 检查进程是否存在。
  2. 对过程进行各种错误检查(PID、 PGID 等)。
  3. 成功后,它不会向 stdout发送任何输出。
  4. 如果有什么不对劲,发送一个错误消息到 stderr
  5. 如果进程失效(例如,Zombie) ,则给您一个假阳性。

更明确地说,shell 脚本的一个有用的函数是:

function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}

这在成功时不返回任何文本给 stdout,但在失败时返回一条错误消息给 stderr(但是我已经将该错误消息重定向到 /dev/null)。

如果您关心的是已停止/僵尸进程状态 ,那么您需要使用 ps,最好使用 --no-headers开关。

#!/bin/ksh


function trim ()
{
echo -n "$1" | tr -d [:space:]
}


function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}


function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)


[[ "$processStatus" == "Z" ]]
return $?
}