Les programmes mal écrits ou défectueux peuvent laisser des processus zombies cachés à l'intérieur de votre ordinateur Linux.. Découvrez comment les zombies sont créés et comment en bref vous pouvez les laisser se reposer.
Comment fonctionnent les états procéduraux sous Linux
Linux, depuis lors, vous devez garder une trace de toutes les applications et démons en cours d'exécution sur votre ordinateur. L'une des façons de le faire est de conserver la table de processus. Ceci est une liste de structures dans la mémoire du noyau. Chaque procédure a une entrée dans cette liste qui contient des informations la concernant.
Il n'y a pas grand-chose dans chacune des structures de table de processus. Ils détiennent le identification du processus, quelques autres éléments de données et un pointeur vers le bloc de contrôle procédural (PCB) pour cette procédure.
C'est le PCB qui contient les nombreux détails que Linux doit trouver ou configurer pour chaque procédure.. Le PCB se met également à jour au fur et à mesure qu'une procédure est créée, on lui donne du temps de traitement et bref il est détruit.
Le PCB Linux contient plus de 95 des champs. il est défini comme une structure appelée task_struct.h
et a plus de 700 lignes. Le PCB contient les types d'informations suivants:
- Etat de la procédure: Les états sont décrits ci-dessous.
- Numéro de procédure: Votre identifiant unique au sein du système d'exploitation.
- Compteur de programme: Lorsque cette procédure a accès à la CPU, le système utilisera cette adresse pour trouver la prochaine instruction de la procédure à exécuter.
- Enregistrements: La liste des registres CPU utilisés par cette procédure. La liste peut contenir des accumulateurs, registres d'index et pointeurs de pile.
- Ouvrir la liste des fichiers: Fichiers associés à cette procédure.
- Informations de programmation du processeur: Utilisé pour définir la fréquence et la durée du temps de traitement du processeur pour cette procédure. La priorité de la procédure, les indicateurs de file d'attente de planification et d'autres paramètres de planification doivent être enregistrés sur le PCB.
- Informations sur la gestion de la mémoire: Détails sur la mémoire utilisée par cette procédure, telles que les adresses de début et de fin de la procédure et les pointeurs vers les pages de mémoire.
- E / S: Tout périphérique d'entrée ou de sortie utilisé par la procédure.
le “Statut de la procédure” peut être l’un des éléments suivants:
- R: Une procédure en cours ou exécutable. Exécution signifie qu'il reçoit des cycles CPU et qu'il s'exécute. Une procédure exécutable est prête à s'exécuter et attend un emplacement CPU.
- S: Une procédure de sommeil. La procédure attend la fin d'une action, comme opération d'entrée ou de sortie, ou qu'une ressource est disponible.
- ré: La procédure est en état de suspension ininterrompue. Vous utilisez un appel système bloquant et ne pouvez pas continuer tant que les appels système ne sont pas terminés. Contrairement à l’état de “suspension”, une procédure dans cet état ne répondra pas aux signaux tant que l'appel système n'est pas terminé et que l'exécution n'est pas revenue à la procédure.
- T: La procédure est terminée (arrêté) parce qu'il a reçu le
SIGSTOP
signe. Cette répondra seulement AlSIGKILL
OSIGCONT
panneaux, qui tuent la procédure ou vous demandent de continuer, respectivement. C'est ce qui arrive quand tu changes premier plan (fg
) pour antécédents (bg)
Corvées. - AVEC: Une procédure zombie. Lorsqu'une procédure est terminée, ça ne part pas. Libère la mémoire que vous utilisez et se supprime de la mémoire, mais son entrée dans la table de processus et PCB reste. Son statut est défini sur
EXIT_ZOMBIE
, et sa procédure mère est notifiée (pour luiSIGCHLD
signe) que la procédure enfant est terminée.
A l'état de zombie, la procédure parent appelle l'un des wait()
familles de fonctions lors de la création de la procédure enfant. Attendre ensuite un changement d'état dans la procédure enfant. La procédure de l'enfant a-t-elle été arrêtée, continué ou éliminé par un signal? Avez-vous fini par exécuter la complétion naturelle de votre code?
Si le changement d'état en est un, cela signifie que la procédure enfant a cessé de s'exécuter, votre code de sortie est lu. Après, le PCB de l'enfant est détruit et son inscription dans le tableau des procédures est supprimée. Idéalement, tout cela se passe en un clin d'oeil, et les processus à l'état zombie n'existent pas longtemps.
EN RELATION: Comment exécuter et contrôler les processus en arrière-plan sous Linux
Quelles sont les causes des processus zombies sous Linux?
Une procédure parent mal orthographiée peut ne pas appeler le wait()
fonction lorsque la procédure enfant est créée. Cela signifie que rien n'est en attente des changements d'état dans la procédure enfant, et le SIGCHLD
le signal sera ignoré. Ou peut-être qu'une autre application affecte l'exécution de la procédure principale, soit en raison d'une mauvaise programmation ou d'une intention malveillante.
Malgré cela, si la procédure parent n'est pas au courant des changements d'état dans la procédure enfant, il n'y aura pas de maintenance appropriée du système. L'entrée du PCB et de la table de processus ne sera pas supprimée à la fin de la procédure enfant. Il en résulte que l'état zombie n'est jamais supprimé du PCB..
Les zombies utilisent un peu de mémoire, mais généralement ils ne représentent pas un obstacle. L'entrée dans la table de processus est petite, mais, jusqu'à sa publication, L'ID de procédure ne peut pas être réutilisé. Sur un système d'exploitation de 64 morceaux, il est peu probable que cela cause des problèmes car le PCB est beaucoup plus gros que l'entrée de la table de processus.
Beaucoup de zombies pourraient, peut-être, affecter la quantité de mémoire disponible pour d'autres processus. Malgré cela, si tu as tant de zombies, vous avez un sérieux obstacle avec l'application principale ou une erreur du système d'exploitation.
Comment supprimer les processus Zombie
Vous ne pouvez pas tuer une procédure zombie car elle est déjà morte. Ne répondra à aucun signal car il a été supprimé de la mémoire; il n'y a nulle part où envoyer un SIGKILL
signe. Vous pouvez essayer d'envoyer le SIGCHLD
procédure de signalement aux parents, mais si cela n'a pas fonctionné lorsque la procédure enfant est terminée, il est peu probable que cela fonctionne maintenant non plus.
La seule solution fiable est de supprimer la procédure principale. Quand ça se termine, ses processus enfants sont hérités par le init
traiter, qui est la première procédure à s'exécuter sur un système Linux (votre identifiant de procédure est 1).
Les init
La procédure effectue régulièrement le nettoyage nécessaire des zombies, alors pour les tuer, il suffit de tuer la procédure qui les a créés. Les top
La commande est un moyen pratique de voir si vous avez des zombies.
Écrivez ce qui suit:
Haut
Ce système a huit processus zombies. Nous vous pouvez les lister en utilisant le ps
commander et le canaliser dans egrep
. Une fois de plus, les processus zombies ont un indicateur d’état de “AVEC” et, en général, tu verras aussi “éteint”.
Écrivez ce qui suit:
ps aux | egrep "AVEC|défunt"
Les processus zombies sont répertoriés.
C'est un moyen plus propre de déterminer les identifiants procéduraux des zombies que de faire défiler d'avant en arrière top
. On voit aussi qu’une application appelée “badprg” généré ces zombies.
L'ID de procédure du premier zombie est 7641, mais nous devons trouver l'identifiant de procédure de sa procédure parente. Nous pouvons le faire en utilisant
de nouveau. Nous utiliserons l'option de sortie (ps
-o
) raconter ps
pour afficher uniquement l'ID de procédure du parent, puis le transmettre avec le ppid=
drapeau.
La procédure que nous voulons trouver sera indiquée à travers le -p
(traiter) puis passez l'identifiant de procédure du zombie.
Pour cela, nous écrivons la commande suivante pour trouver les informations de procédure pour la procédure 7641, mais il ne rapportera que l'ID de la procédure principale:
ps -o ppid = -p 7641
Il nous a été mentionné que l'ID de la procédure principale est 7636. Maintenant, nous pouvons faire des références croisées en utilisant ps
une fois de plus.
On voit que cela correspond au nom de la procédure principale ci-dessus. Pour tuer la procédure principale, utilisez l'option SIGKILL avec la commande kill comme suit:
tuer -SIGKILL 7636
Selon le propriétaire de la procédure principale, il est possible que vous utilisiez également sudo
.
Les zombies ne font pas peur …
... A moins qu'ils ne soient dans une horde massive. Certains ne sont pas à craindre et un simple redémarrage les supprimera.
Malgré cela, si vous remarquez qu'une application ou une procédure génère toujours des zombies, c'est quelque chose que tu dois analyser. Il s'agit très probablement d'un programme mal rédigé, dans quel cas, peut-être qu'il existe une version mise à jour qui nettoie correctement après ses processus enfants.