Question 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 de zombie?


85
2018-03-09 10:44


origine


Pourquoi n'ouvrez-vous pas le moniteur système et ne recherchez-vous pas le processus zombie? - dlin
Comment faire cela sur un serveur sans-tête no-X? - SabreWolfy
Étonnamment, aucune réponse n’indique qu’il n’ya pas de processus zombie dans le système basé sur la sortie ci-dessus. S'il y en avait vraiment un, le ps auxwww | grep 'Z' commande aurait dû montrer un processus dans un Z Etat. Les "informations système" en disant => There is 1 zombie process. semble être un bug. Soit ça, soit il manque des informations dans la question. - arielf


Réponses:


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 a répondu à cette partie):

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

Ce que vous obtenez est Zombies et toute autre chose 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:

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 content avec un zombie, mais tuer le processus parent immédiat 5145 devrait le supprimer.

Ressources supplémentaires sur askubuntu:


102
2018-05-03 08:39



Le résultat que vous affichez dans votre réponse est la commande grep elle-même, pas le processus zombie. C'est la même mauvaise interprétation que Pablo a faite dans sa réponse. La réponse de Rinzwind ci-dessous recherche réellement le processus de zombie et les énumère. Une autre option pourrait être grep pour "défunt" - FvD
pstree -H your_desired_pid -p - Greg M. Krsak
Merci Greg d'avoir ajouté à la discussion, mais s'il vous plaît rappelez-vous que c'est un site d'aide, coller une commande sans expliquer quoi que ce soit n'est pas utile pour la plupart des gens qui viennent chercher de l'aide. - Duncanmoo
C'est une excellente réponse! C'est toujours valable aujourd'hui! J'ai pu trouver mon processus de zombie et tuer son processus parent sans aucun problème. Je vous remercie! - Terrance
si vous n'avez pas installé pstree, ps wauxf fait la même chose - JDS


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 même pas GNU ps fournit un moyen de filtrer par état directement, 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 le filtrer.

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

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 '$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 quelque chose de compliqué pour obtenir des informations sur les processus.


26
2018-01-25 20:29



awk est également un outil puissant qui ne se contente pas de diviser le texte mais peut également y correspondre. +1 ... les autres utilisés grep où c'est inutile et imprécis. - 0xC0000022L
alors maintenant que j'ai la liste des processus de zombie. Comment puis-je les tuer? - chovy
@chovy: Cela dépendra, mais implique généralement de tuer ou de signaler le parent. D'autres réponses vont dans ce sens. Dans la boucle ci-dessus, vous pouvez trouver le pid parent comme ceci: ps -p "$pid" -opid=,ppid= - Sorpigal
Si je veux que le parent ne tue pas tous ses processus enfants? Je veux juste tuer le processus d'un zombie. Je connais le ppid. - chovy
@chovy: la commande que vous voulez est kill -CHLD "$ppid" mais même cela peut ne pas suffire, lisez tout ce post pour comprendre quelles sont vos options. - Sorpigal


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

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

Parmi les commentaires, un amélioré:

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.


4
2018-03-09 10:48



ne retourne toujours rien. Je pense que mon chemin n'était pas mal non plus. - Pablo


Moins c'est plus que ça:

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

C'est comme, donnez-moi 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 montrez-le à moitié moins haut où la 8ème colonne contient un Z, et pourquoi ne pas mettre en évidence toute la ligne.

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

Vous pouvez jeter dans un N avant le p si vous voulez des numéros de ligne, et un J si vous voulez un astérisque au match. 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 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: 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.*
…

Toi pourrait suivez ceci avec (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 suivre cet arbre / forêt à travers la hiérarchie; c'est ce que je recommandais avec l'approche "Less is more".


2
2018-02-14 10:40





Je vous suggère cette commande:

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

0
2018-05-04 15:13



En utilisant aux et sortir des cordes est inutilement peu fiable lorsque vous pouvez utiliser -o et demander exactement ce que vous voulez. Utilisation ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }' au lieu. - Sorpigal


Pour répertorier les zombies de processus, essayez cette commande:

ps j | awk '$7 ~ "Z"'

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

Cela retournera également la liste de leurs identifiants de processus parent (PPID).

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

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

Pour identifier leurs parents, essayez avec pstree, comme:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | 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)

0
2018-02-19 21:12



Recourir à dépouiller une colonne du j format pour cela est inutilement compliqué. Utilisation -o pour choisir ce que vous voulez à la place. - Sorpigal
ps j n'imprime pas tous les processus du système. Il ne répertorie que les processus utilisateur actuels (dans le style de travail BSD), il peut donc manquer des processus de zombies. - arielf