280 votes

Qu'est-ce qu'un processus <defunct>, et pourquoi n'est-il pas tué ?

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 n'a pas été tué :

enter image description here

Qu'est-ce que <defunct> pour un processus et pourquoi il n'est pas tué ?

264voto

amateur barista Points 458

D'après votre sortie, nous voyons un "defunct", ce qui signifie que le processus a soit terminé sa tâche, soit a été corrompu ou tué, mais ses processus enfants sont toujours en cours d'exécution ou ces processus parents surveillent leurs processus enfants. Pour tuer ce type de processus, kill -9 PID ne fonctionne pas. Vous pouvez essayer de les tuer avec cette commande mais elle affichera ce message encore et encore.

Déterminer quel est le processus parent de ce processus défunt et le tuer. Pour le savoir, exécutez 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 défunt a disparu par ps -ef | grep defunct .

81voto

Barry Kelly Points 30330

La page ps(1) du manuel indique :

Procédés marqués <defunct> sont des processus morts (appelés "zombies" ) qui restent parce que leur parent ne les a pas détruits correctement. Ces processus seront détruits par init(8) si le processus parent parent sort.

Vous ne pouvez pas le tuer car il est déjà mort. La seule chose qui reste est une entrée dans la table des processus :

Sur les systèmes d'exploitation informatiques Unix et similaires à Unix, un processus zombie ou processus défunt est un processus qui a terminé son exécution mais qui a toujours mais qui a toujours une entrée dans la table des processus. Cette entrée est toujours nécessaire pour permettre à au processus parent de lire l'état de sortie de son enfant.

Il n'y a aucun mal à laisser de tels processus se dérouler, sauf s'ils sont nombreux. Zombie est finalement récupéré par son parent (en appelant wait(2) ). Si le parent d'origine ne l'a pas récolté avant sa propre sortie alors init processus ( pid == 1 ) le fait à un moment ultérieur. Le processus des zombies est juste :

Un processus qui s'est terminé et qui est supprimé lorsque son état de sortie a été signalé à un autre processus qui attend la fin de ce processus. se termine.

13voto

Kevin Points 871

En développant la réponse de Paddington

D'après vos résultats, nous voyons un défunt ce qui signifie que enfant a soit terminé sa tâche, soit 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>

Voyez qui est le parent : ps ax | grep 27872

Si vous voulez, vous pouvez tuer le parent, et le défunt disparaîtra. kill -9 27872

voir la réponse de Jfs pour un raisonnement plus technique.

3voto

Phaiax Points 31

Je crée accidentellement <defunct> par

  • en les démarrant à partir du terminal et
  • puis les mettre en arrière-plan par accident (Ctrl+Z) et
  • en mettant fin au programme d'une manière ou d'une autre.

La solution est d'essayer la commande fg dans chaque fenêtre de terminal ouverte. Puis les processus défunts disparaissent.

2voto

user76733 Points 61

En complément de la réponse de @Paddington, j'ai ajouté cette fonction à mon bashrc 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
}

Ça donne quelque chose comme :

Children:
UID        PID  PPID  C STIME TTY          TIME CMD
user     25707 25697  0 Feb26 pts/0    00:00:00 \[sh\] 
user     30381 29915  0 11:46 pts/7    00:00:00 grep defunct
------------------------------
Parents:
25697 pts/0    00:00:00 npm

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X