Comment tuer un processus zombie sous Linux

Joyeux Halloween Open SOURCE-rers !
Voici une histoire aussi vieille que époque temps. Depuis qu’il y a eu C et Unix, et (plus tard) Linux, nous avons eu des morts-vivants. Plus précisément, il existe des processus qui sont marqués comme un processus zombie. Incompris par certains, ignoré par d’autres, et immunisé contre les efforts de tant d’entre nous essayant de kill
ces processus sans grand succès. Pourquoi donc?
Contents
Qu’est-ce qu’un processus sous Linux ?
Tout commence lorsqu’un programme sous Linux est exécuté, et lorsqu’il le fait, son instance en cours d’exécution est appelée un processus. Vous pouvez voir tous les processus de votre environnement Linux avec le ps
commander.
$ ps -ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys
2 ? S 0:00 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
Parfois, un processus démarre un autre processus, faisant du premier processus le parent du second. Les pstree
command est un excellent outil qui vous permet de voir la “généalogie” des processus sur votre système.
$ pstree -psn
systemd(1)─┬─systemd-journal(952)
├─systemd-udevd(963)
├─systemd-oomd(1137)
├─systemd-resolve(1138)
├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
│ ├─systemd-userwor(12714)
│ └─systemd-userwor(12715)
├─auditd(1140)───{auditd}(1141)
├─dbus-broker-lau(1164)───dbus-broker(1165)
├─avahi-daemon(1166)───avahi-daemon(1196)
├─bluetoothd(1167)
Chaque processus se voit attribuer un numéro dans le système. L’ID de processus numéro 1 est attribué au tout premier processus exécuté pendant le processus de démarrage, et chaque processus suivant après le PID 1 en est un descendant. Le processus PID 1 est le init, qui sur la plupart des versions plus récentes de Linux n’est qu’un lien symbolique vers le systemd
programme.
Terminer un processus avec la commande kill
Vous pouvez terminer des processus dans un système Linux avec le kill
commander. Malgré le nom, le kill
commande et un ensemble d’autres tels que pkill
et killall
a été écrit/conçu pour envoyer des SIGNAUX à un ou plusieurs processus. Lorsqu’il n’est pas spécifié, le SIGNAL par défaut qu’il envoie est le signal SIGTERM pour terminer le processus.
Lorsqu’un processus parent meurt ou est tué et que son processus enfant ne suit pas la disparition de son parent, nous appelons ce processus un processus orphelin.
Comment tuer un processus zombie
Les processus zombies, en revanche, ne peuvent pas être tués ! Pourquoi pourriez-vous demander? Eh bien, parce qu’ils sont déjà morts !
Chaque processus enfant, lorsqu’il est terminé, devient un processus zombie puis supprimé par le parent. Lorsque le processus quitte son existence et libère les ressources qu’il avait utilisées, son nom figure toujours dans la table de processus du système d’exploitation. C’est ensuite au travail de processus du parent de supprimer son nom de la table de processus. Lorsque cela échoue, nous avons le processus zombie, qui n’est plus vraiment un processus, mais juste une entrée dans la table de processus du système d’exploitation.
C’est pourquoi essayer de faire un kill
commande même avec le -9
L’option (SIGKILL) sur un processus défunt (zombie) ne fonctionne pas, car il n’y a rien à tuer.
Ainsi, pour tuer un processus zombie, comme pour supprimer son nom de la liste des processus (la table des processus), vous devez tuer son parent. Par exemple, si le PID 5878 est un processus zombie et que son parent est le PID 4809, alors pour tuer le zombie (5878), vous terminez le parent (4809) :
$ sudo kill -9 4809 #4809 is the parent, not the zombie
Mon dernier mot d’avertissement sur les zombies. Soyez très prudent lorsque vous tuez des processus parents. Si le parent d’un processus est le PID 1 et que vous le tuez, vous vous redémarrerez !
Et ce sera une histoire encore plus effrayante à raconter !