IT Tuer un processus Zombie

Comme c’est une question qu’on m’a posée lors d’un entretien (et dont je ne connaissais pas la réponse), j’ai cherché comment tuer un processus zombie.
Wikipédia nous apprend qu’on ne peut pas tuer un processus zombie, pour la bonne raison qu’il est déjà mort (logique). Le processus apparait encore dans la liste des processus, et à avoir un ID, même défunt, car il a “oublié” de signaler son décès.
Ce comportement, le plus souvent non voulu, n’est la plupart du temps pas gênant, car un processus zombie ne consomme normalement plus de ressources. Mais dans le cas contraire, en cas de bug par exemple, s’il faut absolument tuer un processus zombie, le seul moyen est de tuer le processus qui l’a généré, son père.

Voici un petit exemple de comment trouver un le père d’un zombie.

On lance la commande top pour afficher le nombre de zombies :

$ top
top - 17:30:36 up 1:37, 3 users, load average: 1,88, 1,80, 1,67
Tasks: 205 total, 1 running, 203 sleeping, 0 stopped, 1 zombie

Ici, on en trouve un. On va chercher dans la liste des processus ceux qui sont en statut “Z” comme zombie, avec un ps et un grep :

ps -aux | grep Z

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aline 2480 0.0 0.0 0 0 ? Z oct.15 0:00 [owncloud]

Pour trouver le père, on lance ps avec l’option pour afficher l’arborescence (j = job format, f = full format), et on fait un grep -E (regexp) sur le terme PPID (pour avoir l’entête de la colonne) et l’ID du process ; on fait un grep -v (reverse) pour supprimer de la liste la commande grep qu’on vient de lancer :

$ ps axjf | grep -E "PPID|2480"| grep -v "grep"
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
2233 2480 1985 1985 ? -1 Z 1000 0:00 | \_ [owncloud]

Ensuite, plus qu’a tuer le père avec un petit kill -9, et le tour est joué !

Comments are closed.