shell脚本中的`kill -0 $ pid`是做什么的?

时间:2012-06-13 10:00:50

标签: bash shell scripting kill

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

7 个答案:

答案 0 :(得分:130)

将信号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.
...

答案 1 :(得分:124)

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

...很难找到关于这个特殊信号的文档。尽管其他人已经说过,但在基于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: $?"

答案 2 :(得分:6)

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

答案 3 :(得分:3)

Kill -0 $ pid用于检查带有pid的进程是否存在。

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

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

  2. 在Zombie进程的情况下,孩子正在等待父母呼叫等待。这里它持有$ pid并在该进程未运行时给出肯定的结果。

答案 4 :(得分:1)

http://djangstorm.com/Content/kill.html。错误检查,这里指的是用户执行命令可用的权限。

答案 5 :(得分:1)

Kill -0 $ pid用于检查运行$ pid的进程是否存活。但这可能很棘手,因为一旦进程退出并且新进程运行,就可以重新分配进程ID。 可以使用killall -0来了解特定进程是否正在运行。

答案 6 :(得分:0)

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)。

如果您担心失效/僵尸进程状态,则需要使用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 $?
}