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

gja*_*ain 137 bash shell scripting signals kill

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

dwa*_*ter 135

将信号发送0到给定的PID只检查是否有任何给定的进程PID正在运行并且您有权向其发送信号.

有关更多信息,请参阅以下联机帮助页:

杀(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
Run Code Online (Sandbox Code Playgroud) 杀(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.
...
Run Code Online (Sandbox Code Playgroud)

  • 此信息的位置(如果存在的话)高度依赖于系统.在最近的基于Debian的系统中,使用`man 2 kill`代替. (7认同)
  • 在我的Fedora 20系统中,"man 1 kill"和"man 2 kill"都有它.虽然很难发现,但这两个手册都埋没了. (2认同)
  • 我觉得命令`man 2 kill` 不在第一修正案范围内:) (2认同)

Tod*_*obs 124

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

...很难找到关于这个特殊信号的文档.尽管其他人已经说过,但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: $?"
Run Code Online (Sandbox Code Playgroud)

您还可以使用它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: $?"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.比另一个好多了.关于信号0的文档很难找到.它隐藏在`kill`手册页中:*"如果sig为0,则不发送信号,但仍会执行错误检查."* (8认同)

Fri*_*ner 6

此命令检查$ pid中的PID是否处于活动状态.

  • @camh:在这两种情况下,`kill -0 $ pid`的返回值都不一样.它将返回"1",因此,如果进程正在运行,如果您没有向其发送信号的权限,则无法解析`kill`的输出.编辑:是的我知道它大部分时间用于检查进程是否存活,但这是错误的,除非你能保证你有权发送信号(例如:成为root) (3认同)
  • -1,因为PID'$ pid`的进程可能正在运行,但您没有向其发送信号的权限. (2认同)
  • @dwalter:如果您没有获得许可,您将获得一个EPERM.如果它不存在,您将获得ESRCH.`kill(1)`会为每个打印出不同的错误.因此,无论您是否有权发送信号,您都可以判断pid是否存在.此外,`kill -0`的典型用法是查看pid是否存活,即使它并不总是正确使用.我会说这个答案是正确的(除了拼写). (2认同)
  • @dwalter:我的观点是答案是正确的.你试图迂腐,并指出还有另一个错误的情况,但我告诉你,从技术上讲,答案也涵盖了这个案例,因为内置的`kill` bash(问题标记为'bash`)输出的类型stderr上的错误,以及返回代码中的错误指示.也就是说,如果正确解释输出,"此命令检查[是否] $ pid中的PID处于活动状态"是完全正确的.[如果你没有说你给出答案的-1,我就不会评论.你的评论是有效的]. (2认同)

小智 5

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

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

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

  2. 在僵尸进程的情况下,哪个孩子正在等待父级呼叫等待。在此,它持有$ pid并在该进程未运行时给出正结果。