Magazine High tech

Les processus Zombies sous Linux

Publié le 29 avril 2008 par Cédrick Hannier

Si une chose est sûre dans ce monde, c'est que de l'informatique on ne connaît jamais tous. Il y a toujours matière à se poser des questions et à apprendre.

Depuis 3-4 jours, je suis embêté par un problème. Quand je lance mon lecteur vidéo, smplayer pour ne pas le nommer, se fige au lancement d'un fichier. Je n'ai malheureusement toujours pas réussi à résoudre le problème. Mais pendant mes recherches infructueuses, j'ai remarqué à plusieurs reprises dans le moniteur système, la présence de 1 voir 2 processus .sh Zombie. Je n'avais jamais vu autant et aussi régulièrement de processus Zombie depuis ma migration sur Hardy Heron.

Alors, après moult tentatives de meurtres contre ces processus zombie et des sudo kill sans effet, je me suis posé la question suivante.

Un processus Zombie c'est quoi ?

Sur les systèmes de type Unix et dérivés, un processus zombie est un processus qui a été lancé par un processus tiers (que l'on appellera processus père ou parent) et qui s'est terminé sans que le processus parent ne soit mis au courant. Le système vide alors la mémoire et les ressources utilisées par le processus Zombie et ensuite la table des processus garde une trace du méchant processus, à disposition du processus parent. Dès lors, au moment ou le processus parent demandera au système l'état du processus dont il est l'instigateur, le processus zombie disparaîtra.

Sur les anciens systèmes, cela provoquait un gaspillage énorme des ressources matérielles et pouvait amener à des blocages car le nombre de processus étant limité par le nombre possible de PID, un trop grand nombre de zombies peut empêcher le système de créer de nouveaux processus. C'est la raison pour laquelle il a été décrété que tout processus bien élevé ne devait pas créer de zombie et par extension qu'il n'était donc pas normal d'en trouver.

La seule manière d'éliminer ces processus zombies consiste à causer la mort du processus parent, par exemple au moyen du signal SIGKILL (qui termine brutalement un processus). Le ou les processus fils sont alors automatiquement rattachés au processus n°1, généralement init, qui se charge à la place du processus parent d'appeler wait (qui suspend l'exécution du processus courant jusqu'à ce qu'un enfant se termine, ou jusqu'à ce qu'un signal à intercepter arrive. Si un processus fils s'est déjà terminé au moment de l'appel, la fonction revient dans la foulée) sur ces derniers. Si ce n'est pas le cas, cela signifie que init est défaillant (ou que le processus n°1 n'est pas init, mais un autre programme n'ayant pas été prévu pour ça); le seul moyen de se débarrasser des zombies, dans ce cas, est le redémarrage du système.

Voilà après cette brève explication, une nouvelle question ce pose. Mais comment trouve t-on le processus parent d'un processus Zombie. Pour cela, suivez le second chapitre.

Comment trouver le coupable.

Pour procéder à une bonne enquête, il faut le bon outil et cet outil s'appelle ps. Il permet de faire un cliché instantané des processus en cours et grâce à une option permet de le faire de façon hiérarchique. Tapez la commande suivante dans un Terminal que vous aurez mis en plein écran (pour faciliter la lecture de certaines lignes à rallonge) 

ps xaf

  • f : affiche les arbres généalogiques des processus.
  • a : présente également les processus des autres utilisateurs.
  • x : affiche les processus qui n'ont pas de terminal de contrôle.

Détaillons l'affichage d'une partie du résultat de mon cas.

 8722 ?   Sl   0:07 /usr/bin/python /usr/lib/deskbar-applet/deskbar-applet --oaf-activate-iid=OAFIID:Deskbar_Applet_Factory --oaf-ior-fd=19
 8831 ?   Z   0:00  \_ [sh] <defunct>
 8843 ?   Z   0:00  \_ [sh] <defunct>

Cela veut dire que le processus 8722 (deskbar-applet) a donné naissance à 2 processus le 8831 (.sh) et le 8843 (.sh) On dit ainsi que le processus 8722 et le processus parent des processus 8831 et 8843. Et c'est donc ce processus parent qui a abandonné ses fils qui, par la suite, sont devenus des zombies (c'est vraiment plus ce que c'était la famille).

Pour répéter ce que je disais un peu plus haut, la seule façon de se débarrasser d'un processus zombie, c'est de tuer son père (le 8722). Mais si on fait cela, il y aura de forte chance de voir disparaître quelque chose à l'écran ou de léser votre système d'un de ses composants. Dans tous les cas les risques sont minimes car si vous tuer un processus père qui plante tout, vous redémarrez et c'est reparti ! Comme dit ma grand-mère on ne fait d'omelette sans casser des oeufs

Pour conclure, j'ai donc tué par le biais du moniteur système, le processus père qui a généré mes 2 processus Zombie, soit pour rappel deskbar-applet. Le système m'a demandé après cette opération si je voulais recharger ce processus. J'ai répondu oui pour voir et il m'a recréé 1 processus Zombie dans la foulée. Deskbar-applet c'est pas bien


Retour à La Une de Logo Paperblog

LES COMMENTAIRES (1)

Par davehb
posté le 29 septembre à 01:24
Signaler un abus

j'utilise nx pour me connecter sur un serveur dédié (hardy heron)

j'ai très souvent des time out, en faisant ps xaf _ sshd: nx [priv]
25585 ? S 0:33 _ sshd: *
25587 ? Ss 0:18 _ netcat
** 25918 ? Z 0:00 _ [nxserver]

si je tue nx sur mon serveur, je n'en ai plus accès ou ???

A propos de l’auteur


Cédrick Hannier 1 partage Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog