🧟

ゾンビプロセスを見てみる

2024/04/06に公開

概要

プロセスについて調べていたら、ゾンビプロセスというものを見つけました。
自分のPCにどれだけいるのか見てみました。

対象読者

ゾンビプロセス?という方
ゾンビプロセスに不快感を持った方

ゾンビプロセスとは

プロセスとしては終了しているが、プロセステーブルに残ってしまっている状態。
通常プロセスが終了すると、親プロセスがwait()というシステムコールで子プロセスのPIDを解放するが、なんらかの問題でwait()できないとゾンビプロセスが誕生する。
CPUやメモリリソースを消費することはないが、プロセスには規定の物理メモリ領域が割り当てられるので、大量にいると問題が発生することがある。

Docker環境ではゾンビプロセスが発生しやすいらしい。

Dockerでゾンビプロセスが発生しやすい理由

親プロセスが異常終了してwaitされない場合、子プロセスはinitの子となる。
通常のinitプロセスは定期的にwait()を行ってくれるので、ゾンビが残らない。
しかし、Dockerではコンテナで実行するメインプロセスがinitプロセスとなるため、wait()を持ち合わせていないのでゴミプロセスが残ってしまう。
https://qiita.com/t_katsumura/items/ed105f1c139b24f7fe4f

ゾンビプロセスを確認

ps auxコマンドのSTATの出力がZのものがそう。
MacOsの場合、pstreeというものを入れればプロセスの親子関係が見れる。
自分のPCにもGoogleアプリケーションの子プロセスにゾンビがいました。<defunct>になっているのがそうです。

ゾンビプロセスを退治する方法

ゾンビプロセスにSIGTERMを送レバ消えると説明されている記事もありましたが、自分の環境では消えませんでした。
その場合は、親プロセスをkillして、initプロセスの子にしてしまえば、勝手にwaitされて消えるとのこと。
親プロセスを落とすとゾンビプロセスたちもいなくなりました。
もちろんPCを再起動しても、全てのプロセスが初期化されるため掃除できます。

まとめ

特にいても不都合はないので意識して削除することはないですが、自分のPCの中にこういったプロセスがいるというのが知れてよかったです。
退治といってもシグナルを送ってどうこうするより、根本原因の対象が必要です。(特定は難しそうですが。。)

Discussion