kill -0是做什么的?

你好

我最近在一个s​​hell脚本中遇到了这个问题。

if ! kill -0 $(cat /path/to/file.pid); then
    ... do something ...
fi

怎么kill -0 ...办?

你好

收集起来有些困难,但是如果您查看以下2个手册页,则会看到以下注释:

杀死(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.
...

因此,信号0实际上实际上不会向您的进程的PID发送任何信息,但会检查您是否具有这样做的权限。

这在哪里有用?

一个明显的地方是您是否要尝试确定是否有权通过来向正在运行的进程发送信号kill您可以在发送所需的实际kill信号之前进行检查,方法是包装检查以确保kill -0 <PID>首先允许该信号。

例子

假设某个进程正在由root用户运行,如下所示:

$ sudo sleep 2500 &
[1] 15693

现在在另一个窗口中,如果我们运行此命令,我们可以确认PID正在运行。

$ pgrep sleep
15693

现在,让我们尝试使用此命令,看看是否可以通过发送该PID信号kill

$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!

这样就可以了,但是输出泄漏了来自kill我们没有权限命令的消息没什么大不了的,只需捕获STDERR并将其发送给即可/dev/null

$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!

完整的例子

因此,我们可以执行以下操作killer.bash

#!/bin/bash

PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then 
  echo "you don't have permissions to kill PID:$PID"
  exit 1
fi

kill -9 $PID

现在,当我以非root用户身份运行以上命令时:

$ ~/killer.bash 
you don't have permissions to kill PID:15693

$ echo $?
1

但是,当它以root身份运行时:

$ sudo ~/killer.bash 

$ echo $?
0

$ pgrep sleep
$

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章