Linuxのゾンビ・プロセス:見つける、削除する、防ぐ
15分で読めます - 2026年5月19日

Linuxでゾンビプロセスを特定、削除、防止する方法を学びます。サーバー管理者のためのコマンド、コード修正、監視のヒント。
Linuxにおけるゾンビプロセス:その検出と削除方法
ゾンビプロセスとは、実行は完了したものの、カーネルのプロセステーブル内のスロットを依然として占有している子プロセスのことです。これは、親プロセスが wait() 呼び出しを行っていないためです。ゾンビプロセスはCPUやメモリを消費しませんが、それぞれがPIDを占有しています。これらが十分に蓄積すると、システムは新しいプロセスを生成できなくなります。本記事では、ゾンビプロセスの特定方法、削除方法、および発生を未然に防ぐ方法について解説します。
サーバーにおけるゾンビプロセスの重要性
単一のゾンビプロセスは無害です。問題は、それらが蓄積し始めたときに発生します。LinuxのPID空間には上限があります。32ビットシステムでは32,768、64ビットシステムでは最大4,194,304です。ゾンビプロセスがプロセステーブルを埋め尽くすと、カーネルは新しいプロセスを作成できなくなります。つまり、新しい接続も、新しいワーカースレッドも、新しいものは何も生成できなくなるということです。
ApacheやNginxのようなWebサーバーは、トラフィックを処理するために子プロセスをフォークするため、特にこの問題の影響を受けやすい。ベンチマークによると、負荷の高いWebサーバーでゾンビプロセスが蓄積すると、スループットが48%低下することが示されている。2019年には、KubernetesのDNSポッドにおけるGo言語のチャネルリークにより、単一ノード上で26,000を超えるゾンビプロセスが生成され、プロセステーブルが埋まり、クラスター全体でDNS解決がクラッシュした。
以下の表は、通常のプロセスとゾンビプロセスの主な違いを示しています:
| 特徴 | 通常のプロセス | ゾンビプロセス |
|---|---|---|
| 状態シンボル | R、S、D、またはT | Z (終了済み) |
| CPU / メモリ | アクティブな使用量 | 0% / 0 (既に終了) |
| プロセス・テーブル・エントリ | 1スロット | 1スロット |
への応答 kill -9 | 即座に終了 | 効果なし(すでにデッド) |
| カーネルメモリ | フルプロセス記述子 | 最小限の終了ステータスのみ |
重要なポイント:ゾンビプロセスには kill -9 ゾンビプロセスを終了させることはできない。それはすでに死んでいるからだ。それを解放する唯一の方法は、親プロセスにそれを回収させるか、親プロセスを終了させて init (PID 1)がそれを継承し、自動的に回収するようにすることです。
ゾンビプロセスの見つけ方
ゾンビプロセスは、STAT 列に「Z」が表示され、 <defunct> コマンド名の横に表示されます。次のコマンドで一覧表示します:
ps aux | grep -w Z削除に必要な親プロセスID(PPID)を確認するには:
ps -eo pid,ppid,stat,comm | grep -w Zこの top コマンドはヘッダー行にゾンビプロセスの総数も表示します。非対話型の簡易チェックを行うには:
top -bn1 | grep zombiepstree を使用した親プロセスの追跡
ゾンビプロセスのPIDが判明したら、原因となった親プロセスを遡ります:
pstree -p -s <zombie_pid>これにより、 init まで表示されます。もし pstree がインストールされていない場合、 ps auxf を実行すると、同様のASCIIツリー表示が得られます。
監視のためのゾンビのカウント
grepプロセス自体を除外したクリーンなカウント:
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'トラブルシューティング中の継続的な監視には:
watch -n 1 'ps aux | grep -w Z | wc -l'ゾンビプロセスの削除方法
ゾンビプロセスは、その終了ステータスを取得することによってのみ削除できます。つまり、親プロセスを経由して処理する必要があります。
1. 親プロセスを見つけます。
ps -o ppid= -p <zombie_pid>2. 親プロセスに子プロセスを回収するようシグナルを送る。
kill -SIGCHLD <parent_pid>これにより、親プロセスは wait() を呼び出すよう指示します。これはシステムに支障をきたすことなく、正常に動作するアプリケーションであれば機能します。
3. SIGCHLD が機能しない場合は、サービスを再起動します。
systemctl restart <service_name>4. 親プロセスが応答しない場合は、強制終了する。
kill <parent_pid>あるいは、SIGTERMを無視する場合は:
kill -9 <parent_pid>親プロセスが終了すると、 init (PID 1) または systemd 孤立したゾンビプロセスを引き継ぎ、直ちに回収します。本番環境では注意が必要です。親プロセスを強制終了すると、そのすべてのアクティブな子プロセスも終了します。
5. クリーンアップを確認する。
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'カウントが 0 であれば、問題ありません。
ゾンビプロセスの防止
コード内で子プロセスを適切に処理する
ゾンビプロセスが蓄積する主な根本原因は、親プロセスが wait()を呼び出さない親プロセスにあります。原因の根本から修正してください:
- C:
signal(SIGCHLD, SIG_IGN);を自動で子プロセスの終了情報を破棄するように設定するか、waitpid(-1, NULL, WNOHANG)を使用して非同期にリープ処理を行ってください。 - Python:
subprocess.run()を使用します。これは自動的に待機します。Popenを使用する場合は、proc.wait()を明示的に呼び出します。 - Bash: バックグラウンドジョブを起動するスクリプトの最後に
waitバックグラウンドジョブを起動するスクリプトの末尾に追加します。
systemdを適切に設定する
systemdによって管理されるサービスの場合、以下の設定によりゾンビプロセスの蓄積を防ぎます:
KillMode=control-groupこれにより、サービスが停止した際にすべての子プロセスが同時に終了します。TimeoutStopSecsystemdがSIGKILLを送信する前に、親プロセスが子プロセスを回収する時間を確保します。WatchdogSec応答のないサービスを自動的に再起動し、親プロセスがハングして子プロセスの回収を停止してしまうケースに対処します。
プロセステーブルを監視する
15分ごとに実行されるcronジョブを設定し、ゾンビプロセスの数をカウントして、その数が閾値を超えた場合にアラートを送信します:
ps aux | awk '$8 ~ /Z/' | wc -lまた、現在のカウントを /proc/sys/kernel/pid_max。80%を超えた場合は、問題になる前に調査してください。通常の動作中に一時的に発生する少数のゾンビプロセスは心配する必要はありません。ゼロに戻らずに増加し続ける場合は、修正が必要なアプリケーションのバグを示しています。
結論
ゾンビプロセスは、クリーンアップされていない「死んだ子プロセス」です。これらはCPUやメモリを使用しませんが、PIDを占有しており、プロセス・テーブルが満杯になると、サーバーは有用な処理を一切行えなくなります。
- これらを
ps aux | grep -w Zを使用してそれらを見つけ、pstree. - 以下のコマンドで削除します
SIGCHLDを送信するか、サービスを再起動するか、最後の手段として親プロセスを強制終了することで削除します。 - 予防策として、
wait()を呼び出すコードを記述し、systemd を正しく設定し、プロセス表を監視することで防止してください。
トラフィックの多いワークロードを実行しており、完全なルートアクセス権を備えた信頼性の高いインフラストラクチャが必要な場合、FDCの専用サーバーなら、プロセス管理やシステム設定を完全に制御できます。

Linuxのゾンビ・プロセス:見つける、削除する、防ぐ
Linuxでゾンビプロセスを特定、削除、防止する方法を学びます。サーバー管理者のためのコマンド、コード修正、監視のヒント。
15分で読めます - 2026年5月19日
Linuxサーバー・ハードニング・チェックリスト
15分で読めます - 2026年5月8日

ご質問またはカスタムソリューションが必要ですか?
柔軟なオプション
グローバル・リーチ
即時展開
柔軟なオプション
グローバル・リーチ
即時展開