「很好地」殺死 bash 進程

「很好地」殺死 bash 進程

我試圖避免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
}

相關內容