145 votes

Comment trouver le 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 ?

177voto

Duncanmoo Points 2010

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épondait à cette partie) :

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

Ce que vous obtenez, ce sont des zombies et tout ce qui contient un Z, donc vous obtiendrez aussi 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

Vous donnera :

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

Dans ce cas, vous ne voulez pas tuer ce processus parent et vous devriez vous contenter d'un zombie, mais tuer le processus parent immédiat 5145 devrait vous en débarrasser.

Ressources supplémentaires sur askubuntu :

49voto

Sorpigal Points 584

Même si cette question est ancienne, j'ai pensé 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 étant un PID et la seconde son état.

Je ne pense pas que même GNU ps fournit 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 PIDs qui sont des zombies. Puisque vous connaissez l'état, il n'est plus nécessaire de l'afficher, donc cela peut être filtré.

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

Donne une liste délimitée par des lignes nouvelles de PIDs de zombies.

Vous pouvez maintenant opérer sur 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 pas besoin de faire quoi que ce soit de compliqué pour en tirer des informations sur les processus.

(Signification des différents états du processus ici - https://unix.stackexchange.com/a/18477/121634 )

7voto

dlamblin Points 739

Mais moins, c'est plus :

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

C'est comme si vous me donniez une forêt (arbre) de tous les processus des utilisateurs dans un format orienté utilisateur avec une largeur illimitée sur n'importe quel tty et que vous me la montriez à un demi-écran au-dessus de l'endroit où il correspond au cas où la 8ème colonne contient un Z, et pourquoi ne pas mettre en évidence la ligne entière.

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

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

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: 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 podría Faites suivre de (et cela détectera si votre terminal aime -U Unicode ou -A Ascii) :

pstree -psS <PID LIST>

Ou juste, tu sais, utilise 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".

4voto

Rinzwind Points 270388

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

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

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

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 toutefois : celle-ci tue aussi le processus.

1voto

Marco Points 121

Je les trouve généralement sur mon serveur avec

ps aux | grep 'defunct'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X