147

基本上,'0' 代表什么信号,因为在这里我看到 SIGNAL 数字从 1 开始。

4

6 回答 6

144

将信号发送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.
...
于 2012-06-13T10:16:04.647 回答
132

这是一个很好的问题,因为...

...很难找到有关此特殊信号的文档。不管其他人怎么说,在man 1 kill基于 Debian 的系统中唯一提到这个信号的是:

特别有用的信号包括 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: $?"
于 2013-01-12T18:08:44.293 回答
10

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

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

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

  2. 在僵尸进程的情况下,哪个子进程正在等待父进程调用等待。在这里,它保存 $pid 并在该进程未运行时给出肯定的结果。

于 2017-03-26T11:12:11.597 回答
6

此命令检查 $pid 中具有 PID 的进程是否处于活动状态。

于 2012-06-13T10:11:55.997 回答
1

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

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

于 2018-02-11T05:20:08.660 回答
1

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

  1. 检查进程是否存在。
  2. 对进程进行各种错误检查(PID、PGID 等...)。
  3. 成功后它不会发送任何输出stdout
  4. 如果有问题,请发送错误消息stderr
  5. 如果进程已失效(即僵尸),则给您一个误报。

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

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

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

如果您担心 defunct/zombie 进程状态,那么您需要使用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 $?
}
于 2020-03-10T12:50:50.670 回答