Halloween sur Linux: comment tuer les processus zombies

timbre d'halloween

Le jour des morts approche et c'est pourquoi nous voulons faire ce petit tutoriel de LxA pour parler de la processus zombie et comment nous pouvons les tuer. La première chose à dire est ce qu'est le processus zombie, et c'est que comme vous le savez, le noyau Linux a un sous-système pour gérer les processus et travaille avec le planificateur pour créer, faire varier la priorité, envoyer ou supprimer le flux de traitement du processeur et tuer les processus. Eh bien, cette partie du noyau, comme le reste des systèmes de type Unix, fait la distinction entre les différents états des processus ...

Donc on peut trouver ça un processus il peut être en état de sommeil (S), c'est-à-dire endormi. Les processus en cours d'exécution (R) qui sont ceux qui sont actuellement en cours d'exécution ou en cours d'exécution, les processus en attente (D) qui sont arrêtés en attente d'être suivis, gestpt (T) ou suspendus, ainsi que les zombies (Z) ou décédés. Un processus zombie ou mort est un processus qui a déjà été arrêté avec succès, mais dont certaines ressources système ont été détournées car Linux est toujours en train de l'enregistrer dans la table des processus. Vous savez déjà que lorsqu'un processus se termine, il ne doit pas rester dans cet état, mais se termine et le noyau libère les ressources pour que d'autres processus puissent les utiliser, en gros cela libère la RAM occupée ...

Eh bien, comme il n'est pas intéressant d'avoir ce type de processus zombies, bien qu'ils ne soient pas aussi fréquents, nous pouvons les rechercher et les éliminer comme indiqué ici. La première chose à faire est de savoir s'il existe des processus zombies dans notre distribution et pour cela nous pouvons nous aider des outils comme top ou comme ps. Par exemple, l'une de ces deux options:

ps -el | grep 'Z'

ps aux | grep defunct

Et une fois détecté, nous pouvons tue-le directement avec:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Bien qu'une autre alternative soit de trouver les processus parents, car tuer un processus zombie Vous devez tuer les processus parents qui le soutiennent, comme vous l'avez peut-être déduit:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Vous devrez remplacer par l'ID du processus zombie que vous avez trouvé et pour le tuer avec kill, utilisez l'ID du processus parent en remplaçant dans l'exemple, évidemment.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données : AB Internet Networks 2008 SL
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   boules faites dit

    Bon site!
    Ils nous sortent toujours des ennuis.

    Où dit:
    Bien qu'une autre alternative soit de trouver les processus parents, car pour tuer un processus zombie, vous devez tuer les processus parents qui le prennent en charge, comme vous l'avez peut-être déduit :

    1 | ps -eo pid, ppid | grep
    2|
    3 | tuer -9

    Vous devrez substituer l'ID du processus zombie que vous avez trouvé et pour le tuer avec kill, utiliser l'ID du processus parent substituant dans l'exemple, évidemment.

    vous pouvez ajouter le script :

    $ chat killppid.sh
    #! / Bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Bien sûr, ce n'est pas une tâche qu'un utilisateur normal effectue tout le temps.
    Cela ne serait utile que pour l'administrateur, mais il est dangereux de l'exécuter en tant que root, car cela peut tuer n'importe quel processus du système.

    Dans man kill il y a cette note :

    REMARQUES Votre shell (interpréteur de ligne de commande) peut avoir une commande kill intégrée. Tu peux
    besoin d'exécuter la commande décrite ici comme / bin / kill pour résoudre le conflit.

    Bash a cette commande, c'est la partie de man bash à ce sujet :

    tuer [-s sigspec | -n signum | -sigspec] [pid | spécifications de l'emploi] ...
    kill -l | -L [sigspec | état_sortie]
    Envoyer le signal nommé par sigspec ou signum aux processus nommés par pid ou job
    spéc. sigspec est soit un nom de signal insensible à la casse tel que SIGKILL (avec ou
    sans le préfixe SIG) ou un numéro de signal ; signum est un numéro de signal. Si
    sigspec n'est pas présent, alors SIGTERM est supposé. Un argument de -l liste les
    noms de signaux. Si des arguments sont fournis lorsque -l est donné, les noms des
    les signaux correspondant aux arguments sont répertoriés et l'état de retour est 0.
    L'argument exit_status de -l est un nombre spécifiant soit un numéro de signal, soit
    l'état de sortie d'un processus terminé par un signal. L'option -L est équivalente
    prêté à -l. kill renvoie true si au moins un signal a été envoyé avec succès, ou
    false si une erreur se produit ou si une option invalide est rencontrée.

    Au début, ils expliquent comment bash protège les processus, pour éviter certains problèmes, mais je ne comprends pas bien comment je pourrais créer un script sûr à exécuter en tant que root.
    La seule chose à laquelle je pense est de le protéger comme ceci:

    $ chat killppid.sh
    #! / Bin / bash
    si [$ USER == "root"]
    then echo Ne pas exécuter $ 0 en tant que root !!! c'est dangereux!
    sortie
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Utilisez le kill de bash, pas / bin / kill

    Comment pouvez-vous voir que je ne connais pas très bien bash.
    Savez-vous comment écrire un script sécurisé qui s'exécute en tant qu'utilisateur du processus enfant, même s'il s'exécute en tant que root ?
    quelque chose d'équivalent à ce qui serait fait manuellement comme ceci :

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')