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 peux pas le tuer avec kill -9
. Comment tuer un processus zombie?
Si le zombie est un processus mort (déjà tué), comment 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 [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
1163 root 0 Z [anyprogramd]
ps -o ppid 1163
dit-on? Autrement dit, qui est le parent de 1163? C'est le processus qu'il faut mettre fin.Réponses:
Un zombie est déjà mort, vous ne pouvez donc pas le tuer. Pour nettoyer un zombie, il doit être attendu par son parent, donc tuer le parent devrait fonctionner pour éliminer le zombie. (Après la mort du parent, le zombie sera hérité par pid 1, qui l'attendra et effacera son entrée dans la table de processus.) Si votre démon génère 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.Un exemple de la façon dont vous pourriez envoyer un signal à chaque processus qui est le parent d'un zombie (notez que cela est extrêmement grossier et peut tuer des processus que vous n'avez pas l'intention. Je ne recommande pas d'utiliser ce type de marteau):
# Don't do this. Incredibly risky sledge hammer! kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
la source
ps aux
?kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
PPid
rangée si vouscat /proc/<pid>/status
Vous pouvez nettoyer un processus zombie en tuant son processus parent avec la commande suivante:
kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
la source
grep
n'est pas nécessaire.ps ... | awk '/[zZ]/{print $2}'
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}
cela fonctionnera :)
la source
Je l'ai 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 tuera pas un processus. Courir
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.
la source
init
pour moi, et maintenant je ne peux rien faire et je suis obligé de redémarrer ... le processus zombie est Java, prenant 3,4 Go sur 4 Go de RAMj'ai essayé
kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
Et cela fonctionne pour moi.
la source
Parfois, le ppid parent ne peut pas être tué, donc tuez le pid zombie
kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
la source