Linuxシステムでゾンビを殺すプロセスの基本的な方法の説明
UNIXシステムでは、プロセスが終了しましたが、親プロセスが待機していない(wait/waitpidを呼び出す)と、ゾンビプロセスになります。fork()/execve()プロセスでは、サブプロセスの終了時に親プロセスが存在すると仮定し、親プロセスfork()の前にSIGCHLD信号処理関数呼び出しwaitpid()がインストールされず、サブプロセスの終了を待つとともに、この信号を明示的に無視しないと、サブプロセスはゾンビプロセスとなる。
プロセスはexitコマンドを呼び出して自分の生命を終了するとき、実際には破棄されていません。ゾンビプロセス(Zombie)と呼ばれるデータ構造を残します(システムはexitを呼び出し、プロセスを終了させる役割を果たしますが、正常なプロセスをゾンビプロセスに変えるだけで、完全に破棄することはできません)。
プロセスの危害 1、ゾンビプロセスの表示方法 コードのコピー#ps -ef | grep defunct
コードのコピー
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
コードのコピー
ps -ef | grep defunct | grep -v grep | wc -l
2、ゾンビをどうやって殺すの?
コードのコピー
ps -e -o ppid,stat | grep Z | cut –d” ” -f2 | xargs kill -9
コードのコピー
kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`
また、子プロセスが死んだ後、親プロセスにSIGCHLD信号が送信され、親プロセスがこの信号を受信した後、waitpid()関数を実行して子プロセスの死体を収容します。親プロセスがwaitを呼び出さなくても、カーネルはSIGCHLDメッセージを送信します。この場合、デフォルトの処理は無視されますが、このメッセージに応答するには処理関数を設定できます。
3、ゾンビを避けるにはどうすればいいですか?または
2回fork()を使用し、後続のサブプロセスを直接終了させ、孫プロセスが孤児プロセスになり、initプロセスがこの孤児プロセスをクリアする責任を負います。