基本上,“0”代表什么信号,因为这里我看到的SIGNAL编号是从1开始的。
发送信号0
到给定的PID
仅检查是否有任何具有给定PID
的进程正在运行,并且您有权限向其发送信号。
有关更多信息,请参见以下手册页:
kill(1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
杀死进程的系统调用(system call)函数。$ 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.
...
man 2 kill
来查看。 - Todd A. Jacobsman 1 kill
和man 2 kill
在我的Fedora 20系统上都有。虽然很难发现,但它们都埋藏在这些手册页中。 - slm如果sig为0(空信号),则会执行错误检查,但实际上不会发送任何信号。空信号可用于检查pid的有效性。
http://pubs.opengroup.org/onlinepubs/009695399/functions/kill.html - taddy hoopsman 2 kill
命令超出了第一修正案的范畴 :) - JBaczuk因为很难找到有关这个特殊信号的文档。尽管其他人所说,但在基于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,则不发送信号,但仍执行错误检查。” - slmkill -0 $pid
是检查具有进程id(pid)的进程是否存在。
在使用kill -0 $pid
检查进程是否存在时要小心,因为:
一旦目标进程退出,它的pid可能会分配给其他新创建的进程。(因此,人们不能确定特定的进程是否仍在运行)
在僵尸进程的情况下,子进程等待父进程调用wait。 在这种情况下,它保留$pid并给出肯定的结果,而该进程未运行。
该命令检查 $pid 中的进程是否正在运行。
kill(1)
将为每个错误打印不同的错误。因此,无论您是否有发送信号的权限,都可以确定pid是否处于活动状态。此外,kill -0
的典型用途是查看pid是否处于活动状态,即使它并不总是被正确使用。我认为这个答案是正确的(拼写除外)。 - camhkill -0 $pid
命令的返回值都是相同的。它将返回 1
,因此如果您没有权限向进程发送信号,则无法仅通过解析 kill
命令的输出来判断该进程是否正在运行。编辑:是的,我知道大多数情况下它用于检查进程是否存活,但是除非您可以保证具有发送信号的权限(例如:是 root 用户),否则这是错误的。 - dwalterkill
bash内置命令(问题标记为bash
)在stderr上输出错误类型,并在其返回代码中指示错误。也就是说,“此命令检查$pid中的PID进程是否存活”如果你正确解释输出,那么完全正确。[如果你没有给答案打-1分,我不会评论。否则你的评论是有效的]。 - camhkill -0 $pid
用于检查进程 $pid
是否在运行。但这可能会有些棘手,因为一旦进程退出并启动新进程,进程ID就可能被重新分配。
可以使用 killall -0 <process name>
来获取特定进程是否正在运行的信息。
EXIT
信号或0
给一个进程将会:stdout
发送任何输出。stderr
发送错误消息。更明确地说,一个对你的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 $?
}
kill 0
(没有破折号)不同,这里有解释这里和这里。 - Adam Katz