Agence web » Actualités du digital » Comment tuer les processus zombies sous Linux

Comment tuer les processus zombies sous Linux

comment-utiliser-pandoc-pour-convertir-des-fichiers-sur-la-ligne-4147938
Fatmawati Achmad Zaenuri / Shutterstock

Les programmes mal écrits ou fonctionnant mal peuvent laisser des processus zombies cachés à l’intérieur de votre ordinateur Linux. Découvrez comment les zombies sont créés et comment vous pouvez enfin les mettre au repos.

Fonctionnement des états de processus sous Linux

Linux, bien sûr, doit garder une trace de toutes les applications et démons en cours d’exécution sur votre ordinateur. Une des façons dont il fait cela est de maintenir la table de processus. Voici une liste de structures dans la mémoire du noyau. Chaque processus a une entrée dans cette liste qui contient des informations à son sujet.

Il n’y a pas grand-chose dans chacune des structures de table de processus. Ils contiennent l’ID de processus, quelques autres éléments de données et un pointeur vers le bloc de contrôle de processus (PCB) pour ce processus.

C’est le PCB qui contient les nombreux détails que Linux doit rechercher ou définir pour chaque processus. Le PCB est également mis à jour au fur et à mesure qu’un processus est créé, compte tenu du temps de traitement, et finalement détruit.

Le PCB Linux contient plus de 95 champs. Il est défini comme une structure appelée task_struct.h, et il fait plus de 700 lignes. Le PCB contient les types d’informations suivants:

  • État du processus: Les états sont décrits ci-dessous.
  • Numéro de processus: Son identifiant unique dans le système d’exploitation.
  • Compteur de programme: Lors de la prochaine connexion de ce processus à la CPU, le système utilisera cette adresse pour trouver la prochaine instruction du processus à exécuter.
  • Registres: La liste des registres CPU utilisés par ce processus. La liste peut contenir des accumulateurs, des registres d’index et des pointeurs de pile.
  • Ouvrir la liste des fichiers: Fichiers associés à ce processus.
  • Informations de planification du processeur: Utilisé pour déterminer à quelle fréquence et pendant combien de temps le temps de traitement du processeur est attribué à ce processus. La priorité du processus, les pointeurs vers les files d’attente de planification et d’autres paramètres de planification doivent être enregistrés dans le PCB.
  • Informations sur la gestion de la mémoire: Détails sur la mémoire utilisée par ce processus, comme les adresses de début et de fin de la mémoire de processus et les pointeurs vers les pages de mémoire.
  • Informations sur l’état des E / S: Tout périphérique d’entrée ou de sortie utilisé par le processus.

L ’« état du processus »peut être l’un des éléments suivants:

  • R: Un processus en cours d’exécution ou exécutable. Running signifie qu’il reçoit des cycles CPU et s’exécute. Un processus exécutable est prêt à être exécuté et attend un emplacement de processeur.
  • S: Un processus de sommeil. Le processus attend la fin d’une action, telle qu’une opération d’entrée ou de sortie, ou qu’une ressource devienne disponible.
  • RÉ: Le processus est dans un état de veille ininterrompu. Il utilise un appel système bloquant et ne peut pas continuer tant que les appels système ne sont pas terminés. Contrairement à l’état «Veille», un processus dans cet état ne répondra pas aux signaux tant que l’appel système n’est pas terminé et que l’exécution est revenue au processus.
  • T: Le processus s’est terminé (arrêté) car il a reçu le SIGSTOP signal. Il ne répondra qu’à la SIGKILL ou SIGCONT signaux, qui arrêtent le processus ou lui ordonnent de continuer, respectivement. C’est ce qui se passe lorsque vous passez du premier plan (fg) en arrière-plan (bg) Tâches.
  • Z: Un processus Zombie. Lorsqu’un processus se termine, il ne disparaît pas simplement. Il libère toute mémoire qu’il utilise et se supprime de la mémoire, mais son entrée dans la table de processus et le PCB restent. Son état est défini sur EXIT_ZOMBIE, et son processus parent est notifié (par le SIGCHLD signal) que le processus fils est terminé.

Dans l’état Zombie, le processus parent appelle l’un des wait() familles de fonctions lors de la création du processus enfant. Il attend ensuite un changement d’état dans le processus enfant. Le processus enfant a-t-il été arrêté, poursuivi ou tué par un signal? A-t-il pris fin en exécutant la complétion naturelle de son code?

Si le changement d’état signifie que le processus enfant a cessé de s’exécuter, son code de sortie est lu. Ensuite, le PCB de l’enfant est détruit et son entrée dans la table de processus est supprimée. Idéalement, tout cela se passe en un clin d’œil, et les processus à l’état zombie n’existent pas très longtemps.

Quelles sont les causes des processus zombies sous Linux?

Un processus parent mal rédigé peut ne pas appeler le wait() fonction lorsque le processus enfant est créé. Cela signifie que rien ne surveille les changements d’état dans le processus enfant, et le SIGCHLD le signal sera ignoré. Ou peut-être qu’une autre application affecte l’exécution du processus parent, soit en raison d’une mauvaise programmation ou d’une intention malveillante.

Cependant, si le processus parent ne surveille pas les changements d’état dans le processus enfant, la gestion interne appropriée du système ne se produira pas. Le PCB et l’entrée dans la table de processus ne seront pas supprimés lorsque le processus enfant se termine. Il en résulte que l’état zombie n’est jamais supprimé du PCB.

Les zombies utilisent un peu de mémoire, mais ils ne posent généralement pas de problème. L’entrée dans la table de processus est petite, mais, tant qu’elle n’est pas publiée, l’ID de processus ne peut pas être réutilisé. Sur un système d’exploitation 64 bits, il est peu probable que cela pose des problèmes car le PCB est beaucoup plus volumineux que l’entrée de la table de processus.

Un grand nombre de zombies pourrait, en théorie, affecter la quantité de mémoire disponible pour d’autres processus. Si vous avez autant de zombies, cependant, vous avez un problème sérieux avec l’application parente ou un bogue du système d’exploitation.

Comment supprimer les processus Zombie

Vous ne pouvez pas tuer un processus zombie car il est déjà mort. Il ne répondra à aucun signal car il a été supprimé de la mémoire – il n’y a nulle part où envoyer un SIGKILL signal. Vous pouvez essayer d’envoyer le SIGCHLD signal au processus parent, mais si cela n’a pas fonctionné lorsque le processus enfant s’est terminé, il est peu probable que cela fonctionne maintenant non plus.

La seule solution fiable est de tuer le processus parent. Lorsqu’il est terminé, ses processus enfants sont hérités par le init processus, qui est le premier processus à s’exécuter dans un système Linux (son ID de processus est 1).

le init processus effectue régulièrement le nettoyage nécessaire des zombies, donc pour les tuer, il vous suffit de tuer le processus qui les a créés. le top La commande est un moyen pratique de voir si vous avez des zombies.

Tapez ce qui suit:

top

haut dans une fenêtre de terminal

Ce système dispose de huit processus zombies. Nous pouvons les lister en utilisant le ps commande et la canalisation dans egrep. Encore une fois, les processus zombies ont un indicateur d’état «Z», et vous verrez généralement aussi «défunt».

Tapez ce qui suit:

ps aux | egrep "Z|defunct"

ps aux |  egrep "Z | défunt" dans une fenêtre de terminal

Les processus zombies sont répertoriés.

Sortie de ps aux |  egrep "Z | défunt" dans une fenêtre de terminal

C’est un moyen plus efficace de découvrir les ID de processus des zombies que de faire défiler top. Nous voyons également qu’une application appelée «badprg» a engendré ces zombies.

L’ID de processus du premier zombie est 7641, mais nous devons trouver l’ID de processus de son processus parent. Nous pouvons le faire en utilisant ps encore. Nous utiliserons l’option de sortie (-o) dire ps pour afficher uniquement l’ID de processus du parent, puis passez-le avec le ppid= drapeau.

Le processus que nous voulons trouver sera indiqué en utilisant le -p (processus), puis en passant l’ID de processus du zombie.

Par conséquent, nous tapons la commande suivante pour rechercher les informations de processus pour le processus 7641, mais elle ne rapportera que l’ID du processus parent:

ps -o ppid= -p 7641

ps -o ppid = -p 7641 dans une fenêtre de terminal

On nous dit que l’ID de processus parent est 7636. Nous pouvons maintenant faire des références croisées en utilisant ps une fois de plus.

ps -e |  grep 7636 dans une fenêtre de terminal

Nous voyons que cela correspond au nom du processus parent de plus tôt. Pour tuer le processus parent, utilisez l’option SIGKILL avec la commande kill comme suit:

kill -SIGKILL 7636

Selon le propriétaire du processus parent, vous devrez peut-être également utiliser sudo.

Les zombies ne font pas peur…

… À moins qu’ils ne soient dans une horde massive. Quelques-uns n’ont pas de quoi s’inquiéter et un simple redémarrage les effacera.

Cependant, si vous remarquez qu’une application ou un processus génère toujours des zombies, c’est quelque chose que vous devriez examiner. Il s’agit probablement d’un programme mal écrit, auquel cas il existe peut-être une version mise à jour qui nettoie correctement après ses processus enfants.

★★★★★