Linux上の「ゾンビプロセス」とは何ですか?
もしあなたがLinuxユーザーなら、ゾンビプロセスがあなたのプロセスリストの周りを震えているのを見たことがあるかもしれません。それはすでに死んでいるので、あなたはゾンビプロセスを殺すことはできません - 実際のゾンビのように.
ゾンビは基本的に、適切にクリーンアップされていない死んだプロセスの残りの部分です。ゾンビプロセスを作成するプログラムは適切にプログラムされていません - プログラムはゾンビプロセスを回避させることになっていません.
画像クレジット:FlickrのDaniel Hollister(Remixed)
ゾンビプロセスとは?
ゾンビプロセスとは何か、そしてゾンビプロセスが出現する原因を理解するには、Linux上でプロセスがどのように機能するかについて少し理解する必要があります。.
プロセスがLinux上で停止した場合、そのプロセス記述子はすぐにメモリから削除されるわけではありません - プロセス記述子はメモリ内に残ります(プロセス記述子はごくわずかな量のメモリを占有します)。プロセスのステータスはEXIT_ZOMBIEになり、プロセスの親プロセスは、その子プロセスがSIGCHLDシグナルで終了したことを通知されます。その後、親プロセスはwait()システムコールを実行して、停止したプロセスの終了ステータスおよびその他の情報を読み取ります。これにより、親プロセスはデッドプロセスから情報を取得できます。 wait()が呼び出された後、ゾンビプロセスはメモリから完全に削除されます.
これは通常非常に早く起こるので、ゾンビプロセスがあなたのシステムに蓄積するのを見ることはないでしょう。しかし、親プロセスが適切にプログラムされておらず、wait()を呼び出さない場合、そのゾンビの子はクリーンアップされるまでメモリに残ります。.
GNOME System Monitorなどのユーティリティ 上 コマンド、そして ps コマンド表示ゾンビプロセス.
ゾンビプロセスの危険性
ゾンビプロセスはシステムリソースを使い果たしません。 (実際には、各プロセスはプロセスディスクリプタを格納するために非常に少量のシステムメモリを使用します。)ただし、各ゾンビプロセスはプロセスID(PID)を保持します。 Linuxシステムには有限個のプロセスIDがあり、32ビットシステムではデフォルトで32767です。ゾンビが非常に速い速度で蓄積している場合、たとえば、不適切にプログラムされたサーバーソフトウェアが負荷のかかるゾンビプロセスを作成している場合、使用可能なPIDのプール全体が最終的にゾンビプロセスに割り当てられ、他のプロセスが起動できなくなります.
しかし、ぶら下がっているいくつかのゾンビプロセスは問題ありません - それらはあなたのシステムの親プロセスにバグがあることを示していますが.
ゾンビプロセスを取り除く
SIGKILLシグナルで通常のプロセスを殺すことができるのでゾンビプロセスを殺すことはできません - ゾンビプロセスはすでに死んでいます。システムに大量のものがない限り、ゾンビプロセスを取り除く必要はありません - いくつかのゾンビは無害です。しかし、ゾンビプロセスを取り除くことができるいくつかの方法があります。.
1つの方法は、SIGCHLDシグナルを親プロセスに送信することです。このシグナルは、wait()システムコールを実行し、そのゾンビの子をクリーンアップするように親プロセスに伝えます。で信号を送る 殺します コマンド、置き換え pid 以下のコマンドで、親プロセスのPIDを指定します。
kill -s SIGCHLD pid
しかし、親プロセスが正しくプログラムされておらず、SIGCHLDシグナルを無視している場合、これは役に立ちません。あなたはゾンビの親プロセスを殺すか閉じる必要があります。ゾンビを作成したプロセスが終了すると、initはゾンビプロセスを継承し、それらの新しい親になります。 initは起動時にLinux上で起動される最初のプロセスで、PID 1が割り当てられています。initは定期的にwait()システムコールを実行してゾンビの子をクリーンアップするので、initはゾンビの動作を短くします。閉じた後に親プロセスを再起動できます.
親プロセスがゾンビを作成し続ける場合は、ゾンビの子を獲得するためにwait()を適切に呼び出すように修正する必要があります。あなたのシステム上のプログラムがゾンビを作り続けている場合はバグレポートを提出.