我最近在一个shell脚本中遇到了这个问题。
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] 删除。
我来说两句