Qu'est-ce qu'un processus <defunct> et pourquoi ne pas être tué?
180
Le navigateur Chrome n'était pas réactif et j'ai essayé de le tuer, mais au lieu de disparaître, le processus avait <defunct>à sa droite et n'a pas été tué:
Qu'est-ce <defunct>qu'un processus et pourquoi il ne soit pas tué?
La réponse acceptée mentionne que " kill -9 PIDne fonctionne pas". C'est partiellement vrai: en réalité, NO kill ne fonctionnera. En outre, -9 devrait être utilisé en dernier recours. 99% du temps, une suppression par défaut du processus parent le supprime ET récupère tous les enfants. Un "kill kill" est un SIGTERM (-15). J'encourage les fans de -9 (SIGKILL) à lire stackoverflow.com/questions/690415/…
Dans votre sortie, nous voyons un "obsolète", ce qui signifie que le processus a soit achevé sa tâche, soit corrompu ou tué, mais que ses processus enfants sont toujours en cours d'exécution ou que ce processus parent surveille son processus enfant. Pour tuer ce genre de processus, kill -9 PID ne fonctionne pas. Vous pouvez essayer de les tuer avec cette commande, mais elle le montrera encore et encore.
Déterminez quel est le processus parent de ce processus obsolète et éliminez-le. Pour le savoir, lancez la commande:
vous ne pouvez pas tuer le processus "défunt". Vous pouvez uniquement accélérer la suppression de son entrée dans une table de processus en supprimant son parent.
jfs
57
Et si la ppid est 1( init)? Supposons que je dois juste attendre?
Luc
7
pour automatiser la suppression, vous pouvez également procéder de la sorte (vous devrez peut-être modifier les octets que vous coupez dans la sortie):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
warren
3
@ Warren Merci. Vous pouvez également rendre cela un peu plus court et plus simple en ne faisant pas un deuxième grep. Il suffit de changer le premier grep en grep [d]efunctou similaire et il ne se correspondra pas.
Thor84no
4
@ Warren, vous ne pouvez pas tuer un processus mort, même avec un SIGKILL. En outre, vous utilisez kill -9 de manière très discrète. Voir stackoverflow.com/questions/690415/… . Si vous voulez tuer des enfants défunts, vous pouvez essayer: parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill. Relancez le script au bout de 30 secondes environ, kill -9si vous le souhaitez. (Notez que je rejette spécifiquement le meurtre de Init)
Les processus marqués <defunct>sont des processus morts (appelés "zombies" ) qui restent car leur parent ne les a pas détruits correctement. Ces processus seront détruits par init(8)si le processus parent se termine.
Sur les systèmes d'exploitation informatiques Unix et de type Unix, un processus zombie ou un processus obsolète est un processus dont l'exécution est terminée mais qui comporte toujours une entrée dans la table des processus. Cette entrée est toujours nécessaire pour permettre au processus parent de lire le statut de sortie de son enfant.
Il n’ya aucun mal à laisser de tels processus s’ils ne sont pas nombreux. Zombie est finalement récolté par son parent (en appelant wait(2)). Si le parent d'origine ne l'a pas récolté avant sa propre sortie, alors initprocess ( pid == 1) le fera plus tard. Zombie Process est juste:
Un processus qui a pris fin et qui est supprimé lorsque son état de sortie a été signalé à un autre processus en attente de la fin de ce processus.
Merci Mike S. Nous avons pris votre ligne de conduite et avons écrit un script qui supprimera les processus obsolètes dont le parent est in.telnetd. Nous ne voulions pas qu'il tue un processus parent, mais simplement telnetd qui, nous le savons, pose un problème et nous l'exécuterons plusieurs fois pour en tuer plusieurs si nécessaire.
# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.
first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"
# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
Dans votre sortie, nous voyons un défunt , ce qui signifie que ce processus enfant a terminé sa tâche ou a été corrompu ou tué. Son processus parent est toujours en cours d'exécution et n'a pas remarqué son enfant mort.
kill -9 PID ne fonctionnera pas (déjà mort).
Pour déterminer le parent de ce processus enfant, exécutez cette commande:
ps -ef | grep defunct
UID PID **PPID** C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
Voir qui est le parent: ps ax | grep 27872
Si vous voulez, vous pouvez tuer le parent et le défunt s'en ira.
kill -9 27872
voir la réponse de JF Sebastian pour un raisonnement plus technique.
kill -9 PID
ne fonctionne pas". C'est partiellement vrai: en réalité, NO kill ne fonctionnera. En outre, -9 devrait être utilisé en dernier recours. 99% du temps, une suppression par défaut du processus parent le supprime ET récupère tous les enfants. Un "kill kill" est un SIGTERM (-15). J'encourage les fans de -9 (SIGKILL) à lire stackoverflow.com/questions/690415/…Réponses:
Dans votre sortie, nous voyons un "obsolète", ce qui signifie que le processus a soit achevé sa tâche, soit corrompu ou tué, mais que ses processus enfants sont toujours en cours d'exécution ou que ce processus parent surveille son processus enfant. Pour tuer ce genre de processus, kill -9 PID ne fonctionne pas. Vous pouvez essayer de les tuer avec cette commande, mais elle le montrera encore et encore.
Déterminez quel est le processus parent de ce processus obsolète et éliminez-le. Pour le savoir, lancez la commande:
ps -ef | grep defunct
Ensuite
kill -9 637 27872
, vérifiez que le processus obsolète est terminéps -ef | grep defunct
.la source
1
(init
)? Supposons que je dois juste attendre?ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
ou similaire et il ne se correspondra pas.parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill
. Relancez le script au bout de 30 secondes environ,kill -9
si vous le souhaitez. (Notez que je rejette spécifiquement le meurtre deInit
)La page de manuel ps (1) dit :
Vous ne pouvez pas le tuer car il est déjà mort. Il ne reste plus qu'une entrée dans la table de processus :
Il n’ya aucun mal à laisser de tels processus s’ils ne sont pas nombreux. Zombie est finalement récolté par son parent (en appelant
wait(2)
). Si le parent d'origine ne l'a pas récolté avant sa propre sortie, alorsinit
process (pid == 1
) le fera plus tard. Zombie Process est juste:la source
Merci Mike S. Nous avons pris votre ligne de conduite et avons écrit un script qui supprimera les processus obsolètes dont le parent est in.telnetd. Nous ne voulions pas qu'il tue un processus parent, mais simplement telnetd qui, nous le savons, pose un problème et nous l'exécuterons plusieurs fois pour en tuer plusieurs si nécessaire.
la source
élargir la réponse de Paddington ..
Dans votre sortie, nous voyons un défunt , ce qui signifie que ce processus enfant a terminé sa tâche ou a été corrompu ou tué. Son processus parent est toujours en cours d'exécution et n'a pas remarqué son enfant mort.
kill -9 PID
ne fonctionnera pas (déjà mort).Pour déterminer le parent de ce processus enfant, exécutez cette commande:
ps -ef | grep defunct
Voir qui est le parent:
ps ax | grep 27872
Si vous voulez, vous pouvez tuer le parent et le défunt s'en ira.
kill -9 27872
voir la réponse de JF Sebastian pour un raisonnement plus technique.
la source
Ajoutant à la réponse de @ Paddington, j’ai ajouté cette fonction à mon bas pour une vérification rapide:
Il génère quelque chose comme:
la source