Le navigateur chrome ne répondait pas et j'ai essayé de le tuer, mais au lieu de disparaître, le processus avait <defunct>
à sa droite et il n'a pas été tué:
Qu'est-ce que <defunct>
pour un processus et pourquoi il n'est pas tué?
Dans votre sortie, nous voyons un "défunt", ce qui signifie que le processus a terminé sa tâche ou a été corrompu ou tué, mais ses processus enfants sont toujours en cours d'exécution ou ces processus parents surveillent 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
UID PID PPID C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
1000 1808 1777 0 Oct04 ? 00:00:00 [zeitgeist-datah] <defunct>
Puis kill -9 637 27872
, puis vérifiez que le processus obsolète est parti par ps -ef | grep defunct
.
La page de manuel ps (1) dit :
Les processus marqués
<defunct>
sont des processus inactifs (appelés ainsi "zombies" ) qui restent car leur parent a pas les détruire correctement. Ces processus seront détruits parinit(8)
si le processus parent est fermé.
Vous ne pouvez pas le tuer car il est déjà mort. La seule chose qui reste est ne entrée dans la table de processus :
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, le processus init
(pid == 1
) le fait ultérieurement. Zombie Process est juste:
Un processus qui s'est terminé 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
élargir la réponse de Paddington ..
De 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 J.F. Sebastian pour un raisonnement plus technique.
Ajoutant à la réponse de @ Paddington, j’ai ajouté cette fonction à mon bash pour une vérification rapide:
defunct(){
echo "Children:"
ps -ef | head -n1
ps -ef | grep defunct
echo "------------------------------"
echo "Parents:"
ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
echo "$ppids" | while read ppid; do
ps -A | grep "$ppid"
done
}
Il génère quelque chose comme:
Enfants: UID PID PPID C HEURE TTY HEURE CMD Utilisateur 25707 25697 0 févr. 26 pts/0 00:00:00 [sh] Utilisateur 30381 29915 0 11:46 pts/7 00:00:00 grep défunt ------------------------------ Parents: 25697 pts/0 00:00:00 pm.