kill -9 <pid>
では強制終了できないプロセスがあります 。特に私がそのプロセスの所有者であるため、そのような場合の問題は何ですか。そのkill
を回避できるものは何もないと思いました オプション。
承認された回答:
kill -9
(SIGKILL)は、プロセスを強制終了する権限がある場合は常に機能します。基本的に、プロセスはsetuidまたはsetgidではなくユーザーが開始するか、rootである必要があります。例外が1つあります。ルートでさえ、致命的なシグナルをPID 1(init
)に送信できません。 プロセス)。
ただし、kill -9
すぐに動作することは保証されていません 。 SIGKILLを含むすべてのシグナルは非同期で配信されます。カーネルは、それらを配信するのに時間がかかる場合があります。通常、信号の配信には最大で数マイクロ秒かかります。これは、ターゲットがタイムスライスを取得するのにかかる時間です。ただし、ターゲットが信号をブロックしている場合、ターゲットが信号のブロックを解除するまで信号はキューに入れられます。
通常、プロセスはSIGKILLをブロックできません。しかし、カーネルコードは可能であり、プロセスはシステムコールを呼び出すときにカーネルコードを実行します。カーネルコードは、システムコールを中断すると、カーネルのどこかでデータ構造が正しく形成されない場合、またはより一般的にはカーネルの不変条件に違反する場合に、すべての信号をブロックします。したがって、(バグまたは設計ミスのために)システムコールが無期限にブロックされた場合、プロセスを強制終了する方法が事実上ない可能性があります。 (ただし、プロセスは システムコールが完了すると強制終了されます。)
システムコールでブロックされたプロセスは、中断できないスリープ状態にあります。 ps
またはtop
コマンドは(ほとんどのユニスで)状態D
で表示します (元々は「 d isk」と思います。
長時間の中断できないスリープの典型的なケースは、サーバーが応答していないときにNFSを介してファイルにアクセスするプロセスです。最新の実装では、中断のないスリープを課さない傾向があります(たとえば、Linuxでは、intr
マウントオプションを使用すると、信号でNFSファイルアクセスを中断できます。
プロセスが長時間中断できないスリープ状態のままである場合は、デバッガーをプロセスに接続するか、straceやdtraceなどの診断ツール(またはUNIXフレーバーに応じて同様のツール)を実行することで、プロセスが実行していることに関する情報を取得できます。 /proc/PID/syscall
Linuxでは。中断のないスリープ状態でプロセスを調査する方法の詳細については、「kill-9」でwgetプロセスを強制終了できないを参照してください。
Z
とマークされたエントリが表示される場合があります (またはH
Linuxでは、ps
の違いはわかりません) またはtop
出力。これらは技術的にはプロセスではなく、ゾンビプロセスであり、プロセステーブルのエントリにすぎず、親プロセスに子の死を通知できるように保持されます。親プロセスが注意を払う(または死ぬ)と、それらは消えます。