ゾンビプロセス
別名: defunctプロセス
結論
ゾンビプロセスとは、実行を終えたのに、親プロセスが終了ステータスをまだ回収していないためにプロセステーブルに残っているプロセスです。CPUは使わず、メモリもほとんど使いません。
プロセスが終わると、親プロセスがどう終了したかを知れるように、システムは小さな記録を残します。通常は親がすぐにその記録を読み取り、エントリは消えます。親が読み取らないままだと、終わったプロセスはゾンビとして一覧に残ります。
ゾンビがいくつかある程度なら無害です。数が着実に増えていくなら、親プログラムのバグを示しています。
このページの内容
Macでゾンビプロセスを見つける方法
ターミナルでps -axo pid,ppid,stat,comm | awk '$3 ~ /^Z/'を実行します。各行がゾンビで、PPIDの列には、その原因となっている親プロセスが表示されます。
ゾンビプロセスをなくす方法
ゾンビはすでに終了しているので、killすることはできません。対処すべきは親のほうです。親アプリを終了するか再起動すれば、ゾンビはlaunchdに引き渡され、launchdが片付けます。
ゾンビを消すためにlaunchdやほかのシステムプロセスを終了してはいけません。親がシステムプロセスなら、Macを再起動すれば消えます。
ゾンビの親を見つける方法
psのコマンド全体の列では、ゾンビは<defunct>と表示されます。プログラムがすでに終了しているからです。対処すべきは親プロセスです。
ps -axo pid,ppid,stat,comm | awk '$3 ~ /^Z/'を実行してゾンビを一覧表示します。STATの列のZがゾンビの印です。- PPIDの列の番号を控えます。
ps -p <PPID> -o pid,user,commandを実行して、どのプログラムが親かを確認します。- アクティビティモニタで“表示 > すべてのプロセス(階層表示)”を選ぶと、同じ親子関係をツリーで見られます。
- 親に対処します。自分で開いたアプリなら、終了して開き直します。ターミナルのシェルやスクリプトなら、そのウインドウを閉じるかスクリプトを止めます。システムプロセスなら、Macを再起動します。
普通のことか、気にすべきことか
親プログラムは、wait系のシステムコールで子の終了ステータスを回収します。子プロセスを起動しても終了を待たないプログラムは、ゾンビを残します。これは親のバグで、根本的に直せるのはその開発者だけです。
ゾンビが一瞬見えるのは普通のことです。ゾンビは、プロセスが終了してから親がその終了ステータスを読み取るまでの間だけ存在し、その時間はたいていごく短いものです。
気にかける価値があるのは、同じ親が多くのゾンビを残したままのときや、数が何時間も増え続けるときです。数えるにはps -axo stat | grep -c '^Z'を、Macのプロセス数の上限を見るにはsysctl kern.maxproc kern.maxprocperuidを実行します。
ゾンビ、孤児、ハングしたプロセスはそれぞれ別物
この3つの用語はよく混同されますが、それぞれ対処法が異なります。
- ゾンビは実行を終えています。残っているのはプロセステーブルのエントリだけです。
- 孤児(オーファン)はまだ動いていますが、親が終了しています。macOSはそれをPID 1のlaunchdに引き渡し、launchdが新しい親になります。
- ハングしたプロセスはまだ動いていますが止まっていて、アクティビティモニタでは“応答なし”と表示されることがよくあります。ゾンビと違い、終了や強制終了ができます。
やってはいけないこと
ゾンビは少数なら無害なので、危険を冒してまで消す理由はありません。
- ゾンビのPIDに
kill -9を実行しないでください。すでに終了しているので、シグナルは効きません。 - ゾンビを消すために、launchdやほかのシステムプロセスを終了しないでください。再起動すれば、同じことを安全に行えます。
- 親が何かを確認せずに終了しないでください。開いている書類があるアプリなら、先に作業内容を保存しましょう。
よくある質問
Macのゾンビプロセスとは?
実行を終えたのに、親が終了ステータスを回収していないため一覧に残っているプロセスです。CPUは使いません。
ゾンビプロセスをkillするには?
直接killすることはできません。psのPPIDの列に表示される親プロセスを終了するか再起動すれば、ゾンビは消えます。
ゾンビプロセスは有害?
いくつかなら問題ありません。1つごとにプロセステーブルの枠を1つ使うので、数が多くなり増え続けると、いずれ問題を起こすことがあり、親プログラムにバグがあることを示しています。
kill -9でゾンビプロセスを消せないのはなぜ?
ゾンビは動いていないので、シグナルで止めるものがないからです。消えるのは、親が終了ステータスを回収したときか、親が終了したときだけです。
Macを再起動すればゾンビプロセスは消える?
はい。再起動するとゾンビとその親を含め、すべてのプロセスが終了します。
ゾンビプロセスはマルウェアのサイン?
いいえ。UNIXのプロセスが終了するときの普通の仕組みの一部です。1つの親から多くのゾンビが出ているなら、たいていそのプログラムにバグがあります。
関連項目
Windowsから乗り換えましたか? Mac用のタスク マネージャーやアクティビティモニタの代替アプリのおすすめもご覧ください。用語集のすべての用語も見られます。