9
votes

processus zombie ne peut pas être tué

Y a-t-il un moyen de tuer un processus de zombie? J'ai essayé appeler Quitter pour tuer le processus et même envoyer un signal sigint au processus, mais il semble que rien ne puisse le tuer. Je programmment pour Linux.


2 commentaires

Oh, je l'avais oublié de faire la plaisanterie évidente: la façon de tuer un zombie est un shoot dans la tête.


quand tueras PID échouer?


6 Réponses :


0
votes

Si je me rappelle correctement, tuer le parent d'un processus de zombie permettra au processus de zombie de mourir.

Utilisez PS FAUx Pour obtenir un bel arbre hiérarchique de vos processus de course montrant les relations parent / enfant.


1 commentaires

Cela lui permet d'être récolté par init .



2
votes

Un processus zombie est un identifiant de processus (et l'état de terminaison associées et les informations d'utilisation des ressources) qui n'a pas encore été attendu par son processus parent. Les seuls moyens de l'éliminer sont d'obtenir son parent à attendre qu'il (parfois cela peut être réalisé en envoyant SIGCHLD pour le parent manuellement si le parent était juste buggy et avait une condition de course où il a manqué la chance d'attendre), mais en général vous êtes hors de la chance, sauf si vous résiliez force le parent.

Modifier Une autre façon, si vous êtes désespérés et ne veulent pas tuer le parent, est de joindre au parent avec gdb et appeler la force waitpid sur l'enfant zombie.


0 commentaires

-2
votes

voir Unix-FAQs "Comment Est-ce que je me débarrasse des processus zombies qui persévèrent? "

Vous ne pouvez pas tuer des zombies, comme ils sont déjà morts. Mais si vous avez trop de zombies, tuez le processus parent ou le service de redémarrage. P>

Vous pouvez essayer de tuer le processus de zombie à l'aide de son PID P>

kill -9 pid


1 commentaires

Non seulement il ne garantit pas de tuer un processus de zombie. kill -9 ne peut jamais tuer un processus de zombie.



11
votes

Les processus zombies sont déjà morts, ils ne peuvent donc pas être tués, ils ne peuvent être émergés que, ce qui doit être fait par leur processus parent via attendre * () . Ceci est généralement appelé "code> idiom idiom, dans le gestionnaire de signal pour sigchld : xxx


4 commentaires

Je suis arrivé à utiliser zombie , mort , tué et enfant moissonneur dans cette réponse :)


Ce code est incorrect. Si vous mettez cela dans votre gestionnaire sigchld , vous risquez de bloquer et de ne jamais revenir.


@R ..: Vous êtes censé utiliser l'un des variantes supportant wnohang


Vous pouvez également avoir le processus de parent ignorer l'état de l'enfant via le signal (sigchld, sig_ign) . Le processus d'enfant disparaît (ne laisse aucun zombie) dès qu'il sortit parce que le parent a enregistré un manque d'intérêt dans le bien-être de ses enfants.



1
votes

kill -17 ZOMBIE_PID

ou

kill -SIGCHLD ZOMBIE_PID

serait peut-être le travail, bu tlike tout le monde dit d'autre, il attend le parent à l'appel wait () donc à moins que les matrices mères sans récolte, et il a obtenu coincé là pour une raison quelconque, vous ne pourriez pas veulent le tuer.


1 commentaires

Mais je pense que c'est faux, vous devrez peut-être envoyer cela au parent, idk



4
votes

Voici un script que j'ai créé pour tuer tous les processus zombies. Il utilise le débogueur GDB pour joindre au processus parent et envoyer un Patient pour tuer le processus de zombie. Cela quittera le parent en direct et ne tuera que le zombie.

Le débogueur GDB devra être installé et vous devrez être connecté avec des autorisations pour joindre à un processus. Ceci a été testé sur Centos 6.3. P>

#!/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 "***********************************************************"


1 commentaires

N'a pas exécuté sur Ubuntu 14.04: Avertissement: /tmp/zombie_slayer.txt: Aucun fichier ou répertoire de ce type .