web-dev-qa-db-fra.com

Comment tuer le processus zombie

J'ai lancé mon programme au premier plan (un programme démon), puis je l'ai tué avec kill -9, mais il me reste un zombie et je ne parviens pas à le tuer avec kill -9. Comment tuer un processus zombie?

Si le zombie est un processus mort (déjà tué), comment puis-je le supprimer de la sortie de ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]
160
MOHAMED

Un zombie est déjà mort, vous ne pouvez donc pas le tuer. Pour nettoyer un zombie, il doit être attendu par son parent. Tuer le parent doit donc éliminer le zombie. (Une fois le parent décédé, le zombie sera hérité du pid 1, qui l'attendra et effacera son entrée dans la table des processus.) Si votre démon engendre des enfants qui deviennent des zombies, vous avez un bogue. Votre démon devrait remarquer quand ses enfants meurent et wait sur eux pour déterminer leur statut de sortie.

Voici un exemple de la manière dont vous pourriez envoyer un signal à chaque processus qui est le parent d'un zombie (notez qu'il s'agit d'un processus extrêmement grossier pouvant tuer des processus que vous ne souhaitez pas. Je ne recommande pas d'utiliser ce type de marteau-luge):

kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
222
William Pursell

Vous pouvez nettoyer un processus zombie en supprimant son processus parent à l'aide de la commande suivante:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
65
krishna murti

J'ai essayé:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

ça va marcher :)

33
Mohammad Rafiee

Trouvé à http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Voici un bon conseil d'un autre utilisateur (Thxs Bill Dandreta): Parfois

kill -9 <pid>

ne tue pas un processus. Courir

ps -xal

le 4ème champ est le processus parent, tuez tous les parents d'un zombie et le zombie meurt!

Exemple

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583 sont des zombies -

kill -9 18581 18582 18583

n'a aucun effet.

kill -9 31706

supprime les zombies.

24
Sergio

J'ai essayé

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

et ça fonctionne pour moi.

19
Jeoffrey