Shell

kill -0 有什麼作用?

  • September 9, 2021

我最近在一個 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

現在讓我們試試這個命令,看看我們是否可以通過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
$

引用自:https://unix.stackexchange.com/questions/169898