Shell
kill -0
有什麼作用?
我最近在一個 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 $