web-dev-qa-db-fra.com

Script Bash pour trouver des processus zombies?

Si récemment, j'ai remarqué que j'ai un processus qui va planter de manière aléatoire et devenir un zombie avec un PPID de 1 (init). On m'a dit que le seul moyen de résoudre ce problème est de redémarrer le PC (ou d'envoyer SIGCHLD à init, qui est .... désabusé/inutile, d'après ce que j'ai compris.)

Essentiellement, ce que je cherche à faire est d’écrire un script bash qui cherchera simplement un processus zombie et, s’il en existe un, redémarre le PC.

Actuellement, j'utilise ce script pour surveiller le processus lui-même:

 ps auxw | grep ethminer | grep -v grep > /dev/null

 if [ $? != 0 ]
 then
    Sudo reboot
 fi

Maintenant, ce script semble fonctionner correctement quand ethminer est en cours d'exécution ou pas en cours d'exécution; il redémarrera la machine s'il ne voit pas ethminer dans la table des processus et ne fait rien s'il ne le voit pas.

Cependant, (de par ma compréhension certes assez vague) puisqu'il n'y a pas de code de sortie lorsque le processus devient un zombie if [ $? != 0 ] ne reçoit aucune entrée et ne fait donc rien.

Y at-il de toute façon que je peux corriger/modifier ce script afin qu'il fasse ce que je veux qu'il fasse? Ou suis-je hors de propos ici?

Merci!

3
cannabeatz

Vous n'êtes pas obligé de reboot quand il s'agit de processus zombies. Voici pourquoi:

  • Un processus devient zombie une fois le processus terminé, mais son parent ne s’est pas appelé wait(2) pour obtenir son code de retour.

  • Le zombie ne prend aucune ressource physique ou virtuelle, à l'exception d'une entrée dans la table de processus du noyau

  • Une fois que le parent appelle wait(2), le zombie sera récolté correctement et l'entrée de la table de processus sera supprimée.

  • Si le zombie devient un orphelin, c'est-à-dire si son parent meurt, alors init (PID 1) héritera du processus et le récoltera en appelant wait(2)

Comme vous pouvez le constater, c'est une question de temps avant que la wait(2) soit appelée et que le zombie soit récolté. Si vous avez beaucoup de zombies au fil du temps, considérez que c'est un défaut de programmation, vous devriez plutôt chercher à corriger (ou demander à réparer) le code plutôt que de rebooting, ce qui est absolument inutile et ne devrait pas être fait.


Pour trouver les processus zombies, obtenez le STATE du processus. S'il s'agit de Z, le processus est un zombie:

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

Ici, je n'ai pris que des champs sélectifs, à savoir le PID, le PPID, l'ETAT et la COMMANDE.

5
heemayl