有没有一种方法可以杀掉僵尸进程?我尝试过调用exit
来结束进程,甚至向进程发送SIGINT
信号,但似乎没有任何东西可以杀死它。我正在为Linux编程。
有没有一种方法可以杀掉僵尸进程?我尝试过调用exit
来结束进程,甚至向进程发送SIGINT
信号,但似乎没有任何东西可以杀死它。我正在为Linux编程。
僵尸进程已经死亡,因此它们无法被杀死,只能通过其父进程通过wait*()
来收割。这通常称为child reaper
习语,在SIGCHLD
的信号处理程序中使用:
while (wait*(... WNOHANG ...)) {
...
}
zombie
, dead
, killed
and child reaper
in this answer :)在这个答案中,我要使用“僵尸”、“死亡”、“杀死”和“小孩收割者”这些词。 :) - ninjaljSIGCHLD
处理程序中,你会冒着阻塞和永远无法返回的风险。 - R.. GitHub STOP HELPING ICEsignal(SIGCHLD, SIG_IGN)
让父进程忽略子进程的状态。当子进程退出时,由于父进程已经声明了不关心子进程的情况,所以该子进程会立即离开(不会留下僵尸进程)。 - unpythonic#!/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 "***********************************************************"
享受。
警告:/tmp/zombie_slayer.txt:没有这个文件或目录
。 - Fernando CorreiaSIGCHLD
来实现),但通常情况下,除非强制终止父进程,否则你将毫无办法。
编辑:另一种方法是,如果你绝望并且不想杀死父进程,则可以使用gdb附加到父进程,并强制调用waitpid
以等待僵尸子进程。kill -17 ZOMBIE_PID
或者
kill -SIGCHLD ZOMBIE_PID
可能会起作用,但像其他人所说,它正在等待父进程调用wait()
,因此除非父进程在没有收割的情况下死亡,并且由于某种原因被卡在那里,否则您可能不想杀死它。
如果我没记错的话,杀死僵尸进程的父进程将允许僵尸进程死亡。
使用ps faux
可以获得您正在运行的进程的漂亮分层树,显示父/子关系。
init
收获它。 - ninjalj查看unix-faqs "如何摆脱持续存在的僵尸进程?"
你无法杀死僵尸进程,因为它们已经死了。但如果你有太多的僵尸进程,那么可以杀死父进程或重新启动服务。
你可以尝试使用其pid来杀死僵尸进程。
kill -9 pid
kill -9
命令不仅不能保证杀死僵尸进程,而且永远也无法杀死僵尸进程。 - R.. GitHub STOP HELPING ICE