
私は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)
}
余談ですが、この機能のより良い名前は何でしょうか? 現在の名前は「Killing 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
}