本日サーバーのメンテナンスをしていたところ、nova-novncproxyのゾンビプロセスを5つ発見しました。
26327 ? S 0:05 \_ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf 4765 ? Z 0:00 \_ [nova-novncproxy] <defunct> 4766 ? Z 0:00 \_ [nova-novncproxy] <defunct> 4767 ? Z 0:00 \_ [nova-novncproxy] <defunct> 4768 ? Z 0:00 \_ [nova-novncproxy] <defunct> 4769 ? Z 0:00 \_ [nova-novncproxy] <defunct>
私はこれまでゾンビのプロセスについてあまり知らなかったので、それに対処する方法を学ぶためにすぐに関連記事を見つけました。
定義
UNIX システム用語では、終了したが親がまだ待機していないプロセスをゾンビ (wait/waitpid を呼び出す) と呼び、フォークではゾンビ プロセスになります。 ()/execve() プロセスでは、子プロセスの終了時に親プロセスがまだ存在し、親プロセスが fork() の前に SIGCHLD シグナルをインストールしていないと想定されます。ハンドラー関数が waitpid() を呼び出して子プロセスを待機する場合プロセスが終了し、シグナルを明示的に無視しなかった場合、子プロセスはゾンビ プロセスになります。
Linux システム上のゾンビ プロセスを確認する方法、および存在するゾンビ プロセスの数を数える方法?
#ps -ef | grep defunct
または、ステータス Z のプロセスを見つけます。Z はゾンビプロセスの略で、ゾンビプロセスを意味します。
さらに、topコマンドを使用して表示すると、Sの列があります。ステータスがZの場合、ゾンビプロセスであることを意味します。
タスク: 合計 95、実行中 1、スリープ 94、停止 0、ゾンビ 0
ゾンビプロセスもトップコマンドでカウントされます。または、次のコマンドを使用します:
ps -ef grep | grep -v grep | ゾンビプロセスを強制終了するには?
一般に、ゾンビプロセスを直接殺すことは困難ですが、ゾンビパパを殺すことはできます。親プロセスが終了すると、ゾンビ プロセスは「孤立プロセス」になり、プロセス 1 に採用されます。init は常にゾンビ プロセスのクリーンアップを担当します。それが生成したすべてのゾンビプロセスも消えました。
ps -e -o grep Z | Cut -d” ” -f2 ]' awk '{print $2}'`
もちろん、より良いシェル スクリプトを作成することもできます。みんなとともに。
nova-novncproxy を停止してから再度起動すると、ゾンビプロセスが消え、問題が解決しました。
さらに、子プロセスが終了すると、親プロセスに SIGCHLD シグナルが送信され、親プロセスはこのシグナルを受信した後、waitpid() 関数を実行して子プロセスの死体を収集します。これは、親プロセスが wait を呼び出さなくても、カーネルは親プロセスに SIGCHLD メッセージを送信しますが、デフォルトの処理ではこれを無視することになっていますが、このメッセージに応答したい場合は、この原則に基づいています。処理関数を設定します。
ゾンビプロセスを回避するには?
SIGCHLD シグナルの処理は必要ありません。ただし、一部のプロセス、特にサーバー プロセスでは、リクエストが到着したときにリクエストを処理するために子プロセスが生成されることがよくあります。親プロセスが子プロセスの終了を待たないと、子プロセスはゾンビプロセス(ゾンビ)となり、システムリソースを占有します。親プロセスが子プロセスの終了を待つと、親プロセスの負担が増大し、サーバー プロセスの同時実行パフォーマンスに影響を与えます。 Linux では、SIGCHLD 信号の動作を SIG_IGN に設定するだけで済みます。
signal(SIGCHLD,SIG_IGN);このようにして、カーネルは子プロセスの終了時にゾンビプロセスを生成しません。これは BSD4 とは異なります。BSD4 では、孫プロセスが孤立プロセスであるため、init プロセスはこの孤立プロセスをクリーンアップする責任があります。
Linux でゾンビ プロセスをクリーンアップする方法に関するその他の記事については、PHP 中国語 Web サイトに注目してください。