ゾンビプロセスを強制終了する方法はありますか? プロセスを強制終了するために呼び出し、プロセスにシグナルをexit
送信しようとしましたが、プロセスを強制終了することはできないようです。SIGINT
私はLinux用にプログラミングしています。
6 に答える
ゾンビプロセスはすでに死んでいるので、殺すことはできず、刈り取ることができるだけです。これは、を介して親プロセスによって実行される必要がありますwait*()
。これは通常、次child reaper
のシグナルハンドラではイディオムと呼ばれSIGCHLD
ます。
while (wait*(... WNOHANG ...)) {
...
}
これは、すべてのゾンビプロセスを強制終了するために作成したスクリプトです。GDBデバッガーを使用して親プロセスに接続し、waitpidを送信してゾンビプロセスを強制終了します。これにより、親はライブのままになり、ゾンビのみが殺されます。
GDBデバッガーをインストールする必要があり、プロセスにアタッチするためのアクセス許可を使用してログインする必要があります。これはCentos6.3でテストされています。
#!/bin/bash
##################################################################
# Script: Zombie Slayer
# Author: Mitch Milner
# Date: 03/13/2013 ---> A good day to slay zombies
#
# Requirements: yum install gdb
# permissions to attach to the parent process
#
# This script works by using a debugger to
# attach to the parent process and then issuing
# a waitpid to the dead zombie. This will not kill
# the living parent process.
##################################################################
clear
# Wait for user input to proceed, give user a chance to cancel script
echo "***********************************************************"
echo -e "This script will terminate all zombie process."
echo -e "Press [ENTER] to continue or [CTRL] + C to cancel:"
echo "***********************************************************"
read cmd_string
echo -e "\n"
# initialize variables
intcount=0
lastparentid=0
# remove old gdb command file
rm -f /tmp/zombie_slayer.txt
# create the gdb command file
echo "***********************************************************"
echo "Creating command file..."
echo "***********************************************************"
ps -e -o ppid,pid,stat,command | grep Z | sort | while read LINE; do
intcount=$((intcount+1))
parentid=`echo $LINE | awk '{print $1}'`
zombieid=`echo $LINE | awk '{print $2}'`
verifyzombie=`echo $LINE | awk '{print $3}'`
# make sure this is a zombie file and we are not getting a Z from
# the command field of the ps -e -o ppid,pid,stat,command
if [ "$verifyzombie" == "Z" ]
then
if [ "$parentid" != "$lastparentid" ]
then
if [ "$lastparentid" != "0" ]
then
echo "detach" >> /tmp/zombie_slayer.txt
fi
echo "attach $parentid" >> /tmp/zombie_slayer.txt
fi
echo "call waitpid ($zombieid,0,0)" >> /tmp/zombie_slayer.txt
echo "Logging: Parent: $parentid Zombie: $zombieid"
lastparentid=$parentid
fi
done
if [ "$lastparentid" != "0" ]
then
echo "detach" >> /tmp/zombie_slayer.txt
fi
# Slay the zombies with gdb and the created command file
echo -e "\n\n"
echo "***********************************************************"
echo "Slaying zombie processes..."
echo "***********************************************************"
gdb -batch -x /tmp/zombie_slayer.txt
echo -e "\n\n"
echo "***********************************************************"
echo "Script complete."
echo "***********************************************************"
楽しみ。
ゾンビ プロセスは、親プロセスがまだ待機していないプロセス ID (および関連する終了ステータスとリソース使用情報) です。それを排除する唯一の方法は、親にそれを待機させることです (SIGCHLD
親にバグがあり、待機する機会を逃した競合状態があった場合、手動で親に送信することでこれを達成できる場合があります)。親を強制的に終了しない限り、運が悪いです。
編集:もう 1 つの方法は、絶望的で親を殺したくない場合は、gdb を使用して親にアタッチしwaitpid
、ゾンビの子を強制的に呼び出すことです。
kill -17 ZOMBIE_PID
また
kill -SIGCHLD ZOMBIE_PID
おそらくうまくいくでしょうが、他のみんなが言ったwait()
ように、親が刈り取りをせずに死なない限り、親がそう呼ぶのを待っています。
私の記憶が正しければ、ゾンビ プロセスの親を強制終了すると、ゾンビ プロセスが停止します。
ps faux
親/子関係を示す、実行中のプロセスの素敵な階層ツリーを取得するために使用します。
unix-faqs「永続的なゾンビプロセスを取り除くにはどうすればよいですか?」を参照してください。
ゾンビはすでに死んでいるので、殺すことはできません。ただし、ゾンビが多すぎる場合は、親プロセスを強制終了するか、サービスを再起動してください。
あなたはそのpidを使用してゾンビプロセスを殺すことを試みることができます
kill -9 pid
kill -9は、ゾンビプロセスを強制終了することを保証するものではないことに注意してください