
我試圖避免kill -9
由於中描述的原因無用的 Kill -9 套用信函。這個功能是否足夠,或者我需要kill
在超時後終止進程或處理其他微妙之處?
soft_kill()
{
# Try to avoid forcing a kill
# @param $1: PID
kill $1 || kill -INT $1 || kill -HUP $1 || \
(echo "Could not kill $1" >&2; kill -KILL $1)
}
順便說一句,這個函數有什麼更好的名字呢?現在的名字讓我想起了《輕輕殺了我》,manslaughter
聽起來有點嚴厲。也許spoon_kill
(Google一下)?
答案1
您的 soft_kill 有一些問題。
- 殺死進程不是瞬時的,但是一旦發送訊號,kill就會退出。您必須等待一段時間才能確定kill指令是否成功或是否需要升級到-INT或-HUP。
- 殺死返回(1)如果允許發送訊號則為零(成功)。如果成功終止進程則不會。所以在你的程式碼中只有第一個kill會被執行。
(1)
殺()
傳回值
如果成功,kill() 回傳值為零。失敗時,它會傳回值 -1,不發送訊號,並將 errno 設定為以下值之一:
有效值
sig 的值是無效或不受支援的訊號號。
EPRM
發送進程的使用者ID沒有特權;其真實或有效的使用者ID與接收進程的真實或已儲存的使用者ID不符。或者,該進程沒有權限將訊號傳送到任何接收進程。
歐洲研究中心
找不到與 pid 指定的進程或進程組相對應的進程或進程組。
答案2
terminate () {
# accepts PID as $1, defaults to current process
local signals=(TERM INT QUIT HUP KILL) s=0 process=${1:-$$}
local signal_qty=${#signals[@]}
while pgrep $process >/dev/null
do
signal=${signals[s]}
[[ $signal = KILL ]] && echo "Attempting to force kill it." >&2
kill -$signal $process
(( ++s >= signal_qty )) && { echo "It won't die." >&2; return 1; }
sleep 1
done
}