僵尸进程不能被杀死

有没有办法杀死僵尸进程? 我试着调用exit来杀死进程,甚至发送SIGINT信号给进程,但似乎没有任何东西可以杀死它。 我正在为Linux编程。

Solutions Collecting From Web of "僵尸进程不能被杀死"

僵尸进程已经死了,所以它们不能被杀死,只能通过wait*()方法来完成。 在SIGCHLD的信号处理程序中,这通常称为child reaper成语:

 while (wait*(... WNOHANG ...)) { ... } 

这里是我创建的杀死所有僵尸进程的脚本。 它使用GDB调试器附加到父进程,并发送一个waitpid杀死僵尸进程。 这将离开父母的生活,只有杀死僵尸。

GDB调试器将需要安装,您将需要登录与权限附加到一个进程。 这已经在Centos 6.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到父母,如果父母只是越野车,并有竞争条件,它错过了等待的机会),但通常你除非你强行终止父母,否则不会运气好的。

编辑:另一种方式,如果你绝望,不想杀父,是用gdb附加到父,并强行调用僵尸孩子waitpid

如果我没有记错的话,杀死一个僵尸进程的父母将会让僵尸进程死亡。

使用ps faux来获得显示父/子关系的正在运行的进程的分层树。

kill -17 ZOMBIE_PID

要么

kill -SIGCHLD ZOMBIE_PID

可能会工作,不像其他人说的那样,它正在等待父母调用wait() ,除非父母没有收获而死亡,并且由于某种原因,你可能不想杀死它。

请参阅unix-faqs “如何摆脱持续僵尸进程?”

你不能杀僵尸,因为他们已经死了。 但是,如果你有太多的僵尸,然后杀死父进程或重新启动服务。

你可以尝试使用它的PID来杀死僵尸进程

 kill -9 pid 

请注意kill -9并不保证杀死一个僵尸进程