Comment trouver un processus de zombie?

85
System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
[email protected]:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
[email protected]:~$ 

Comment trouver ce processus zombie?

    
posée Pablo 09.03.2012 - 11:44
la source

6 réponses

99

Pour tuer un zombie (processus), vous devez tuer son processus parent (comme les vrais zombies!), mais la question était de savoir comment le trouver.

Trouvez le zombie (La question répond à cette partie):

[email protected]:~$ ps aux | grep 'Z'

Ce que vous obtenez est Zombies et tout autre avec un Z, donc vous aurez également le grep:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

Trouvez le parent du zombie:

[email protected]:~$ pstree -p -s 93572

Vous donnera:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

Dans ce cas, vous ne voulez pas tuer ce processus parent et vous devriez être assez content avec un zombie, mais tuer le processus parent immédiat 5145 devrait le supprimer.

Ressources supplémentaires sur askubuntu:

réponse donnée Duncanmoo 03.05.2013 - 10:39
la source
26

Même si cette question est ancienne, je pensais que tout le monde méritait une réponse plus fiable:

ps axo pid=,stat=

Cela émettra deux colonnes séparées par des espaces, la première étant un PID et la seconde son état.

Je ne pense pas que même GNU ps fournisse un moyen de filtrer directement par état, mais vous pouvez le faire de manière fiable avec awk

ps axo pid=,stat= | awk '~/^Z/ { print }'

Vous avez maintenant une liste de PID qui sont des zombies. Comme vous connaissez l’état, il n’est plus nécessaire de l’afficher, vous pouvez donc le filtrer.

ps axo pid=,stat= | awk '~/^Z/ { print  }'

Donner une liste de PID zombies délimités par des nouvelles lignes.

Vous pouvez maintenant opérer sur cette liste avec une simple boucle shell

for pid in $(ps axo pid=,stat= | awk '~/^Z/ { print  }') ; do
    echo "$pid" # do something interesting here
done

ps est un outil puissant et vous n'avez pas besoin de faire quoi que ce soit de compliqué pour en extraire des informations sur les processus.

    
réponse donnée Sorpigal 25.01.2014 - 21:29
la source
4

ps aux | awk '{ print " " }' | grep -w Z

De: lien

D'après les commentaires, une version améliorée:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print }'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print }'); do
        kill -9 $every;
    done;
done;

Attention cependant: celui-ci tue aussi le processus.

    
réponse donnée Rinzwind 09.03.2012 - 11:48
la source
1

Moins c'est plus que ça:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

C'est comme, donnez-moi une forêt (arbre) des processus de tous les utilisateurs dans un format orienté utilisateur avec une largeur illimitée sur n'importe quel tty et montrez-le à moitié d'écran ci-dessus, Z, et pourquoi ne pas mettre en évidence toute la ligne.

Le format orienté utilisateur semble signifier: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND donc le statut Zombie apparaîtra dans la 8ème colonne.

Vous pouvez ajouter N avant p si vous voulez des numéros de ligne et J si vous voulez un astérisque lors de la correspondance. Malheureusement, si vous utilisez G pour ne pas mettre en évidence la ligne que l'astérisque ne montre pas, J crée un espace pour cela.

Vous finissez par obtenir quelque chose qui ressemble à:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: [email protected]/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

Vous pourriez faire le suivi avec (et il détectera si votre terminal aime -U Unicode ou -A Ascii):

pstree -psS <PID LIST>

OU simplement, vous savez, utilisez la flèche vers le haut dans less pour suivre cet arbre / cette forêt dans la hiérarchie; c'est ce que je recommandais avec l'approche "Less is more".

    
réponse donnée dlamblin 14.02.2018 - 11:40
la source
0

Je vous suggère cette commande:

ps aux | awk '"[Zz]" ~  { printf("%s, PID = %d\n", , ); }'
    
réponse donnée Peycho Dimitrov 04.05.2015 - 17:13
la source
0

Pour lister les zombies de processus, essayez cette commande:

ps j | awk ' ~ "Z"'

Vous devrez peut-être modifier en fonction de votre système d'exploitation.

Cela renverra également la liste de leurs identifiants de processus parents ( PPID ).

Pour essayer de tuer les zombies (après avoir testé la commande ci-dessus), essayez:

kill -9 $(ps j | awk 'NR>1 &&  ~ "Z" {print }')

Pour identifier leurs parents, essayez avec pstree , comme:

$ ps j | awk 'NR>1 &&  ~ "T" {print }' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)
    
réponse donnée kenorb 19.02.2016 - 22:12
la source

Lire d'autres questions sur les étiquettes