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?
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:
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.
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 N
avant p
si vous voulez des numéros de ligne et un J
si vous voulez un astérisque. Malheureusement, si vous utilisez G
pour ne pas mettre en surbrillance la ligne que l’astérisque n’affiche pas, bien que J
cré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 less
pour suivre cet arbre/cette forêt à travers la hiérarchie; c'est ce que je recommandais avec l'approche "Moins, c'est plus".
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.
Je vous suggère cette commande:
ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'