процесс зомби не может быть убит - PullRequest
9 голосов
/ 14 июня 2011

Есть ли способ убить зомби-процесс?Я пытался вызвать exit, чтобы завершить процесс, и даже отправить SIGINT сигнал процессу, но кажется, что ничто не может его убить.Я программирую для Linux.

Ответы [ 6 ]

11 голосов
/ 14 июня 2011

Процессы зомби уже мертвы, поэтому их нельзя убить, их можно только собрать, что должно быть сделано их родительским процессом через wait*().Обычно это называется идиома child reaper в обработчике сигнала для SIGCHLD:

while (wait*(... WNOHANG ...)) {
    ...
}
4 голосов
/ 15 марта 2013

Вот скрипт, который я создал, чтобы убить ВСЕ процессы зомби.Он использует отладчик 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 "***********************************************************"

Наслаждайтесь.

2 голосов
/ 14 июня 2011

Зомби-процесс - это идентификатор процесса (и связанный статус завершения и информация об использовании ресурса), которого еще не ожидал его родительский процесс.Единственный способ устранить это - заставить своего родителя ждать его (иногда это можно сделать, отправив SIGCHLD родителю вручную, если родитель просто глючил и имел состояние гонки, в котором он упустил шанс подождать), нообычно вам не повезло, если вы не принудительно уволили родителя.

Редактировать: Другой способ, если вы в отчаянии и не хотите убивать родителя, - это присоединитьсяродитель с GDB и принудительно позвоните waitpid на ребенка-зомби.

0 голосов
/ 14 июня 2011

kill -17 ZOMBIE_PID

OR

kill -SIGCHLD ZOMBIE_PID

, возможно, сработает, но, как и все остальные, ожидает, что родитель позвонит wait(), поэтому, если родитель не умрет, не пожав, и он застрянет там по какой-то причине, вы можете не захотеть его убивать.

0 голосов
/ 14 июня 2011

См. unix-faqs"Как избавиться от зомби-процессов, которые продолжаются?"

Вы не можете убивать зомби, так как они уже мертвы. Но если у вас слишком много зомби, убейте родительский процесс или перезапустите службу.

Вы можете попытаться убить зомби, используя его pid

kill -9 pid

Обратите внимание, что kill -9 не гарантирует уничтожение процесса зомби

0 голосов
/ 14 июня 2011

если я правильно помню, убийство родителя процесса зомби приведет к смерти процесса зомби.

используйте ps faux, чтобы получить хорошее иерархическое дерево ваших запущенных процессов, показывающее отношения родитель / потомок.

...