bash プロセスを「適切に」終了する

bash プロセスを「適切に」終了する

私はkill -9Killの無駄な使用-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)
}

余談ですが、この機能のより良い名前は何でしょうか? 現在の名前は「Kill​​ing Me Softly」を思い出させ、manslaughter少し厳しい感じがします。おそらくspoon_kill(Google で検索してください)?

答え1

soft_kill にはいくつか問題があります。

  • プロセスの強制終了は瞬時に行われるわけではありませんが、シグナルが送信されるとすぐに kill は終了します。kill コマンドが成功したかどうか、または -INT または -HUP にエスカレートする必要があるかどうかを判断するには、しばらく待つ必要があります。
  • キルリターン(1)シグナルの送信が許可されている場合は 0 (成功)。プロセスの強制終了に成功した場合は 0 ではありません。したがって、コードでは最初の強制終了のみが実行されます。

(1)

殺す()
戻り値
成功した場合、kill() は 0 の値を返します。失敗した場合は、-1 の値を返し、シグナルを送信せず、errno を次のいずれかの値に設定します。

アインヴァル
sig の値が無効またはサポートされていないシグナル番号です。

エペルム
送信プロセスのユーザー ID に特権がありません。つまり、その実ユーザー ID または有効ユーザー 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
}

関連情報