ゾンビプロセスへの対処法、学部のときにさらっと習った程度でいままでなんとかなってしまっていたのですが、ちゃんと抑えておきたかったので Linux Journal の記事 をメモしておきます
----(ここから)----
別名「defunct」または「kill」プロセス - 簡単に言えば、ゾンビプロセスとは、終了させたのにシステムのプロセステーブルに存在しているプロセスのことです。本来、ジョブは実行が完了した時点でプロセステーブルからクリーンアップされるべきですが、何らかの理由で親プロセスが実行後に適切にクリーンアップしなかったため、ゾンビプロセスとして残ってしまったのです。
Linuxの世界では、子プロセスは処理が終了すると親プロセスに通知します。親プロセスはプロセステーブルから子プロセスを削除します。このとき、親プロセスが子プロセス(完了したプロセス)からプロセスの状態を読み取れないと、プロセスをメモリから削除することができず、既に終了したプロセスがプロセステーブルに存在し続けることになります。
ゾンビプロセスを殺すためには、まずそのプロセスを特定する必要があります。以下のコマンドでゾンビプロセスを見つけることができます。
$ ps aux | egrep "Z|defunct"
STAT欄に「Z」、または出力の最後の(COMMAND)欄に「defunct」と表示されている場合は、ゾンビプロセスであることを示しています。
ゾンビはすでに死んでいるので、実際には殺すことはできません。できることは、親プロセスに明示的に通知することで、子(死んだ)プロセスの状態を読み取ることを再試行し、最終的にプロセステーブルから削除することができます。これは親プロセスに SIGCHLD シグナルを送ることで可能です。親プロセスのID(PID)を調べるには、次のコマンドを使用します。
$ ps -o ppid= <Child PID>
ゾンビの親プロセスIDがわかったら、次のコマンドで親プロセスにSIGCHLDシグナルを送ることができます。
$ kill -s SIGCHLD <Parent PID>
また、ゾンビプロセスが急増して親プロセスが停止した場合は、親プロセスを再起動するしかありません。次のコマンドを使用すると、その親プロセスを強制終了できます。
$ kill -9 <Parent PID>
親プロセスを殺すと、その子プロセスのすべてに影響するので、安全のために簡単なダブルチェックを行うとよいでしょう。また、いくつかのゾンビプロセスがCPUやメモリをあまり消費していない場合は、親プロセスを強制終了するか、次回の定期システムメンテナンス時にシステムを再起動することをお勧めします。
原文著者の紹介
NawazはLinuxの愛好家で、7年以上もIT/ソフトウェアに携わっています。
シェルスクリプト、Python、AWSを中心に活動している。自動化を得意としており、「手動で繰り返される作業は、自動化の必要性が生じる程度まで綿密に行うべきである」と考えている。Nawaz の連絡先は、LinkedInとEメールです。