終了できないプロセスがありますkill -9 <pid>
。特に私はプロセスの所有者なので、この場合の問題は何ですか?私はこの選択から抜け出すことができないと思いますkill
。
答え1
kill -9
(信号を殺す)プロセスを終了する権限がある限り、常に機能します。デフォルトでは、プロセスはsetuidまたはsetgid以外のユーザーによって開始される必要があります。それ以外の場合はrootユーザーでなければなりません。 1つの例外があります。ルートラもinit
PID 1(プロセス)に致命的な信号を送信できません。
しかし、kill -9
効果が保証されるわけではありませんまもなく。すべての信号(SIGKILLを含む)は非同期で転送されます。カーネルが信号を送るのに少し時間がかかることがあります。通常、信号を送信するのに最大数マイクロ秒かかります。これは、ターゲットがタイムスライスを取得するのにかかる時間とまったく同じです。ただし、対象がある場合信号をブロックしました、信号はターゲットがロックを解除するのを待ちます。
通常、プロセスはSIGKILLをブロックできません。ただし、カーネルコードは実行され、プロセスは呼び出されるとカーネルコードを実行します。システムコール。システムコールが中断されると、カーネルコードはすべての信号をブロックし、カーネルのどこかに誤ったデータ構造が発生するか、より一般的にはいくつかのカーネル不変性に違反します。したがって、(バグや設計エラーが原因で)システムコールが無期限にブロックされている場合、実際にプロセスを終了することは不可能です。 (しかし、その過程は〜するシステムコールが完了すると終了します。 )
システムコールでブロックされたプロセスは、次の場所にあります。邪魔されない睡眠。ps
または、コマンドはtop
(ほとんどの unice で)ステータスを表示しますD
(元は「D私の考えでは)。
中断されない長いスリープモードの一般的なケースは、プロセスがファイルにアクセスする場合です。ネットワークファイルシステムサーバーが応答しない場合、最新の実装では中断のない省電力モードが適用されない傾向があります(たとえば、Linuxではカーネル2.6.25以降、SIGKILLはNFSアクセスでブロックされたプロセスを中断します)。
プロセスが長時間中断せずにスリープモードになっている場合は、デバッガを接続して次の診断ツールを実行してこれを実行できます。ストレスまたは道(またはUNIXタイプに応じて同様のツール)または次のような他の診断メカニズムを使用してください。/proc/PID/syscall
Linuxで。バラより「kill -9」を使用してwgetプロセスを終了することはできません。中断のない睡眠プロセスを研究する方法についてのさらなる議論。
時には、または出力で表示されているものを見ることができますZ
(またはH
Linuxでは違いが何であるかわかりません)。技術的には、これらはプロセスではなく、ゾンビプロセスであり、親プロセスが子プロセスの終了を知らせるように維持されるプロセステーブルのエントリにすぎません。親プロセスが実行されると消えます。ps
top
集中する(または死)。
答え2
時にはプロセスが存在しますが、次の理由で終了できません。
- ゾンビになります。つまり、親プロセスが終了ステータスを読み取っていません。これらのプロセスは、PIDエントリを除いてリソースを消費しません。
top
Zでマーク - 邪魔されない睡眠が間違っています。これは起こってはいけませんが、欠陥のあるカーネルコードおよび/または欠陥のあるハードウェアの組み合わせが原因で発生します。唯一の方法は、再起動または待つことです。
top
Dが信号を送信します。
答え3
あなたも一つぐらいはあるようです。ゾンビプロセス。これは無害です。ゾンビプロセスが消費する唯一のリソースは、プロセステーブルのエントリです。親プロセスが死亡した場合、または子プロセスが死亡すると消えます。
top
次のコマンドを使用して、プロセスがゾンビプロセスであることを確認できます。
ps aux | awk '$8=="Z" {print $2}'