Plop les bovins.
Dès fois les coïncidences sont un peu étranges…
La semaine dernière deux amis à qui j’ai fais découvrir GNU/Linux m’ont demandé ce qu’était les processus Zombies qu’ils ont découvert à l’occasion d’une commande top sous GNU/Linux.
Aujourd’hui je fouine un peu sur mes sites de références et je tombe sur ce billet en anglais.
Pour les non anglophones on va résumer un peu le sujet (bien qu’internet regorge déjà de réponses à ce sujet).
Alors qu’est ce qu’un processus zombie sous GNU/Linux ?!! Rassurez vous, il ne s’agit pas d’un vilain monstre prêt à sortir de votre bécane pour venir vous manger la cervelle.
Sur les systèmes Unix et dérivés un processus Zombie est généralement généré par une application mal codée. Vous pouvez les dénicher à l’aide d’une simple commande top comme le montre la capture ci-dessous (ou accessoirement on peut voir qu’il n’y en a pas) :
Quand un processus (enfant) meurt (se termine) il n’est pas supprimé immédiatement de la mémoire, son descripteur reste présent en mémoire et occupe une place minime.
Si tout ce passe normalement le processus (parent) devrait être informé du changement de statut de son rejeton via le signal SIGCHLD et la commande Wait () devrait être lancée afin de purger le processus encore présent en mémoire.
Pour diverses raisons il se peut parfois que le processus parent ne soit pas informé du changement d’état de son fils, qui devient alors ce fameux processus « Zombie » occupant inutilement une place en mémoire.
Dans la plus part des cas ce n’est pas bien grave, le problème se règle de lui même quand vous redémarrez de votre machine.
Cela peut très vite devenir gênant en revanche quand un où plusieurs processus parent(s) continuent à générer des zombies à la pelle, surtout sur des serveurs qui souvent ne redémarrent pas pendant plusieurs semaines voir plusieurs mois. Chaque Zombie possédant son propre PID et les PID n’étant pas infinis sur les systèmes GNU/Linux (un système 32 bits en possède un peu plus de 32000), ils peuvent mener plus ou moins rapidement à la saturation d’un système.
Comme un problème ne vient jamais seul et que les zombies sont déjà morts, une simple commande KILL/SIGKILL ne pourra pas en venir à bout. On ne tue pas un mort, c’est bien connu. :)
Pour vous débarrasser d’un processus zombie il vous faudra donc envoyer le signal SIGCHLD au processus parent, à l’aide de la commande suivante (remplacez PID par celui du processus parent ) :
kill -s SIGCHLD pid
Cela dit ceci ne suffit pas toujours, si le processus parent n’est pas codé correctement il peut ignorer SGCHLD et il faudra dans ce cas aller le killer manu militari (à ce stade il commence vraiment à nous gonfler). Il ira ensuite rejoindre init (le PID 1 sous GNU/Linux) qui exécute régulièrement wait () et qui se chargera de la « grande purge ».
NB : Pour faciliter l’identification d’un processus, vous pouvez entrer cette commande :
ps xaf
f : affiche l’arborescence des processus.
a : affiche les processus des autres utilisateurs.
x : affiche les processus n’ayant pas de terminal de contrôle.
Enfin si le processus parent continue a générer des zombies quand vous le relancez, un report de bug sera la seule solution pour résoudre le problème.
Voilà une piètre explication qui je l’espère vous en aura appris un peu plus sur les zombies sous UNIX/GNU/Linux.
Amusez vous bien.
Moo !!!
Commentaires récents