Les processus Zombies sous Linux

Mardi 29 avril 2008 18:41

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 :-)

Dirigez-vous directement à la fin et laisser un commentaire. Les trackbacks ne sont actuellement pas autorisés.

12 commentaires sur “Les processus Zombies sous Linux”

  1. Linuxnico dit:

    29 avril 2008 à 22:27

    tiens c marrant, je vient de faire le ps axf pour voir et j’ai le meme soucis… :-(

    et des que je vire deskbar-applet et que je le relance, pareil, un zombie :-(

    bug or not bug?

  2. Davromaniak dit:

    30 avril 2008 à 10:40

    Salut.

    Dans l’absolu, un processus Zombie ne peut pas être tué, car il est dans un état indéfini, qui est à la fois mort et vivant.

    Il est vivant, car il n’a pas libéré la mémoire qu’il a alloué, mais il est mort, car il ne fait rien.

    Pour achever un processus zombie, il y a plusieurs possibilités.

    - Attendre, car a un moment, il va libérer sa mémoire, et finir par mourrir.
    - Tuer le père, mais dans ce cas, il peut y avoir un cas d’adoption du processus zombie par un autre processus, donc tuer le père d’un zombie ne fonctionne pas à tous les coups.
    - Dans le pire des cas, s’il y a des trouzaines de processus zombies, vaut mieux redémarrer la machine, ça nuit gravement à la qualité de service.

    @+

  3. tuxce dit:

    30 avril 2008 à 12:06

    vu que tu as utilisé le moniteur système (je suppose gnome) pour tuer le processus, tu pouvais aussi l’utiliser pour voir la hiérarchie des processus. Dans l’onglet “Processus”, taper Ctrl+D ou Menu “Affichage” - “Dépendances”

  4. Cedynamix dit:

    30 avril 2008 à 12:34

    @ tuxce : Tu confirmes bien ce que je disais en introduction de ce billet. On apprend toujours. En tout cas c’est sur que c’est bien plus simple comme celà. Merci du tuyau

  5. Pierre dit:

    30 avril 2008 à 13:32

    Article très intéressant ! Ça ne fait jamais de mal de connaître le pourquoi du comment…

    Si Davromaniak dit vrai, ce ne sont pas seulement des processus zombie, mais des processus zombie-chat-de-schrödinger (cf. l’article de Wikipedia : http://fr.wikipedia.org/wiki/Chat_d... ) ! ;)

  6. Davromaniak dit:

    30 avril 2008 à 16:04

    Ouais, c’est un peu des chats de Schrödinger, mais bon.

    Si on va dans cette optique, un zombie est dans un état similaire au chat de Schrödinger.

    Donc voila encore une discussion interminable sur les processus sous linux, :D.

    @+

  7. Kolia dit:

    30 avril 2008 à 19:12

    Pour voir les processus sous forme d’arbre, il y a cette commande : pstree

  8. Armand dit:

    1 mai 2008 à 9:40

    Très bon article très instructif!
    Il mériterait une entrée dans le wiki officiel!

  9. Olivemrs dit:

    1 mai 2008 à 13:11

    Quelle généalogie ! Si j’ai bien compris les \_ indiquent les processus fils et il y a même des petits fils et toute la smala …
    Et les processus zombis sont indiqué par [sh] <defunct> …

  10. chimay dit:

    1 mai 2008 à 15:07

    un truc sympa aussi pour vite voir les dépendances c’est la commande “pstree” en console

    il existe peut-être des équivalents graphiques mais je n’ai pas eu l’occasion de creuser :)

  11. macroblocs dit:

    1 mai 2008 à 16:42

    Pour ton probléme avec smplayer, tu pense qu’il y a un rapport avec les processus zombie ?
    Pour ma part je n’ai qu’un seul zombie, mais il me cause pas de probleme apparement. Puis je suis pas assez cruel pour tuer son pere..

  12. tbellemb dit:

    4 mai 2008 à 12:28

    Très bon billet ! Je ne connaissais pas exactement le sens de ces processus zombie. Merci pour ce petit cours !

Laisser un commentaire

-->

Linux