Les programmes mal écrits ou performants peuvent laisser Processus de zombie se cacher à l'intérieur de votre ordinateur Linux. Découvrez comment les zombies sont créés et comment vous pouvez enfin les poser de vous reposer.
Comment les états de processus fonctionnent sur Linux
Linux, bien sûr, doit garder une trace de toutes les applications et des démons à exécuter sur votre ordinateur. L'une des façons de maintenir la table de processus. Ceci est une liste de structures dans la mémoire du noyau. Chaque processus a une entrée dans cette liste qui contient des informations à ce sujet.
Il n'y a pas beaucoup de choses dans chacune des structures de la table de processus. Ils tiennent la ID de processus , quelques autres éléments de données et un pointeur au bloc de contrôle de processus (PCB) pour ce processus.
C'est le PCB qui détient les nombreux détails que Linux doit rechercher ou définir chaque processus. Le PCB est également mis à jour en tant que processus créé, de temps de traitement, et finalement détruit.
Le PCB Linux contient plus de 95 champs.
C'est défini
comme une structure appelée
task_truct.h
et c'est plus de 700 lignes de long. 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 : Lorsque ce processus est ensuite donné l'accès à la CPU, le système utilisera cette adresse pour trouver la prochaine instruction du processus qui doit être exécutée.
- Registres : La liste des registres de la CPU utilisées par ce processus. La liste peut contenir des accumulateurs, des registres d'index et des pointeurs de pile.
- Liste de fichiers ouverte : Fichiers associés à ce processus.
- Information de planification du processeur : Utilisé pour déterminer à quelle fréquence, et pendant combien de temps, le temps de traitement de la CPU est attribué à ce processus. La priorité du processus, les pointeurs vers la planification des files d'attente 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 Ce processus utilise, telles que les adresses de démarrage et de fin de la mémoire de processus et des pointeurs vers les pages de mémoire.
- Informations sur l'état des E / S : Tous les dispositifs d'entrée ou de sortie utilisés par le processus.
L'état "Process State" peut être n'importe lequel des éléments suivants:
- R: Un processus en cours d'exécution ou exécutable. Courir signifie qu'il reçoit des cycles de processeur et d'exécuter. Un processus runnable est prêt à exécuter et à attendre une fente de la CPU.
- S: Un processus de sommeil. Le processus attend qu'une action complète, telle qu'une opération d'entrée ou une sortie, ou pour une ressource à devenir disponible.
- RÉ: Le processus est dans un état de sommeil ininterrompu. Il utilise un appel du système de blocage et ne peut pas continuer tant que les appels système sont terminés. Contrairement à l'état "Sommeil", un processus dans cet état ne répondra pas aux signaux tant que l'appel du système n'est pas terminé et que l'exécution est renvoyée au processus.
-
T:
Le processus s'est terminé (arrêté) parce qu'il a reçu le
Sigstopsignal. Ce ne répondra que à laSigkillouSigcontLes signaux, qui tuent le processus ou leur demandent de continuer, respectivement. C'est ce qui se passe lorsque vous échangez de au premier plan (fg) à Contexte (bg)Tâches. -
Z:
Un processus de zombie. Lorsqu'un processus se termine, il ne manque pas de disparaître. Il libère toute mémoire qu'il utilise et se supprime de mémoire, mais son entrée dans la table de processus et la PCB restent. Son état est défini sur
Exit_zombieet son processus parent est notifié (par leSigchldsignal) que le processus enfant a fini.
Dans l'État zombie, le processus parent appelle l'un des
attendre()
familles de fonctions
lorsque le processus d'enfant est créé. Il attend ensuite un changement d'état dans le processus d'enfant. Le processus d'enfant a-t-il été arrêté, continua ou tué par un signal? Est-ce que cela s'est terminé par l'achèvement naturel de son code?
Si le changement d'état est un élément qui signifie que le processus enfant a cessé de fonctionner, 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 de l'État zombie n'existent pas depuis très longtemps.
EN RELATION: Comment exécuter et contrôler les processus de fond sur Linux
Qu'est-ce qui cause des processus zombies sur Linux?
Un processus parent mal écrit pourrait ne pas appeler le
attendre()
fonction lorsque le processus d'enfant est créé. Cela signifie que rien ne regarde les changements d'État dans le processus d'enfant et le
Sigchld
le signal sera ignoré. Ou peut-être une autre application affecte peut-être l'exécution du processus parent, soit en raison d'une programmation médiocre ou d'une intention malveillante.
Toutefois, si le processus parent ne surveille pas les changements d'état dans le processus d'enfant, le système de ménage du système approprié ne se produira pas. Le PCB et l'entrée dans la table de processus ne seront pas supprimés lorsque le processus d'enfant se termine. Il en résulte que l'État zombie n'a jamais été retiré 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 jusqu'à ce qu'elle soit libérée, l'ID de processus ne peut pas être réutilisé. Sur un système d'exploitation de 64 bits, il est peu probable que ce soit des problèmes car le PCB est beaucoup plus grand que l'entrée de la table de processus.
Un grand nombre de zombies pourrait, éventuellement, affecter la quantité de mémoire gratuite pour d'autres processus. Si vous avez beaucoup de zombies, cependant, vous avez un problème grave avec l'application parent ou un bogue système d'exploitation.
Comment supprimer les processus zombies
Vous ne pouvez pas tuer un processus de zombie parce que c'est déjà mort. Il ne répondra à aucun signal, car il a été retiré de la mémoire - il n'y a nulle part d'envoyer un
Sigkill
signal. Vous pouvez essayer d'envoyer le
Sigchld
Signalez au processus parent, mais si cela ne fonctionnait pas lorsque le processus d'enfant s'est terminé, il est peu probable de travailler maintenant, non plus.
La seule solution fiable est de tuer le processus parent. Quand il est terminé, ses processus enfants sont hérités par le
init
processus, qui est le premier processus à exécuter dans un système Linux (son identifiant de processus est 1).
Les
init
processus effectue régulièrement le nettoyage nécessaire des zombies, afin de les tuer, il vous suffit de tuer le processus qui les a créés. Les
Haut
La commande est une façon commode de voir si vous avez des zombies.
Tapez les éléments suivants:
Top
Ce système comporte huit processus zombies. Nous
peut énumérer ces
en utilisant le
ps
commander
et la tuer dans
Egrep
. Encore une fois, les processus de zombies ont un drapeau d'état de "Z" et vous verrez généralement "défunt".
Tapez les éléments suivants:
PS AUX | Egrep "z | défunt"
Les processus zombies sont répertoriés.
Ceci est une façon de découvrir les ID de processus des zombies que de faire défiler l'arrière
Haut
. Nous voyons également qu'une application appelée «Badprg» a engendré ces zombies.
L'ID de processus du premier zombie est de 7641, mais nous devons trouver l'ID de processus de son processus parent. Nous pouvons le faire en utilisant
de nouveau. Nous utiliserons l'option de sortie (
ps
-o
) dire
ps
Pour afficher uniquement l'ID de processus du parent, puis transmettez-le avec le
ppid =
drapeau.
Le processus que nous voulons trouver sera indiqué en utilisant le
-p
option (processus), puis en passant dans l'ID de processus du zombie.
Par conséquent, nous tapissons la commande suivante pour rechercher les informations de processus du processus 7641, mais elle ne signalera que l'ID du processus parent:
PS -O PPID = -P 7641
On nous dit que l'ID de processus parent est de 7636. Nous pouvons maintenant faire référence à cela en utilisant
ps
une fois de plus.
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:
Tuez -Sigkill 7636
En fonction du propriétaire du processus parent, vous devrez peut-être également utiliser.
sudo
.
Les zombies ne sont pas effrayantes ...
... à moins qu'ils ne soient dans une horde massive. Quelques-uns ne sont pas à craindre et un simple redémarrage les essuyera.
Toutefois, si vous remarquez qu'une application ou un processus est toujours des zombies de frai, c'est quelque chose que vous devriez examiner. Il est fort probable qu'un programme écrit de théâtre, auquel cas, peut-être une version mise à jour qui se nettoie correctement après ses processus enfants.