web-dev-qa-db-fra.com

Comment trouver un processus zombie?

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
a@SERVER:~$ 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
a@SERVER:~$ 

Comment trouver ce processus zombie?

96
Pablo

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

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

a@SERVER:~$ ps aux | grep 'Z'

Vous obtenez des zombies et tout ce qui contient un Z, vous obtiendrez donc 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:

a@SERVER:~$ pstree -p -s 93572

Te 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 satisfait d'un zombie, mais tuer le processus parent immédiat 5145 devrait s'en débarrasser.

Ressources supplémentaires sur askubuntu:

118
Duncanmoo

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 délimitées par des espaces, la première est 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 '$2~/^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 filtrer ce dernier.

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

Donner une liste délimitée par une nouvelle ligne de PID zombies.

Vous pouvez maintenant utiliser cette liste avec une simple boucle Shell

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

ps est un outil puissant et vous n'avez rien de compliqué à faire pour en extraire des informations sur les processus.

32
Sorpigal

Moins, c'est plus si:

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

C’est comme, donnez-moi une forêt (arborescence) de tous les processus des utilisateurs dans un format orienté utilisateur avec une largeur illimitée sur n’importe quel tty et montrez-la-moi sur un demi-écran au-dessus où cela correspond au cas où la huitième colonne contient un Z, et pourquoi ne pas souligner toute la ligne.

Le format orienté utilisateur semble signifier: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND afin que le statut de Zombie apparaisse dans la 8ème colonne.

Vous pouvez ajouter Navant psi vous voulez des numéros de ligne et un Jsi vous voulez un astérisque. Malheureusement, si vous utilisez Gpour ne pas mettre en surbrillance la ligne que l’astérisque n’affiche pas, bien que Jcrée un espace pour celle-ci.

Vous finissez par avoir 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: lamblin@pts/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 suivre cela (et il détectera si votre terminal aime -U Unicode ou -A Ascii):

pstree -psS <PID LIST>

OU juste, vous savez, utilisez la flèche vers le haut dans lesspour suivre cet arbre/cette forêt à travers la hiérarchie; c'est ce que je recommandais avec l'approche "Moins, c'est plus".

3
dlamblin

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

De: http://www.cyberciti.biz/tips/killing-zombie-process.html

Parmi les commentaires améliorés:

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

Attention cependant: celui-ci tue également le processus.

3
Rinzwind

Je vous suggère cette commande:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
0
Peycho Dimitrov