Come trovare il processo 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]:~$ 

Come trovare il processo di zombie?

    
posta Pablo 09.03.2012 - 11:44

6 risposte

100

Per uccidere uno zombi (processo) devi uccidere il suo processo genitore (proprio come i veri zombi!), ma la domanda era come trovarlo.

Trova lo zombie (la domanda ha risposto a questa parte):

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

Quello che ottieni sono Zombi e qualsiasi altra cosa con una Z, quindi otterrai anche il 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

Trova il genitore dello zombie:

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

Ti darò:

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

In questo caso non vuoi uccidere quel processo genitore e dovresti essere abbastanza felice con uno zombi, ma uccidere il processo genitore immediato 5145 dovrebbe sbarazzartene.

Risorse aggiuntive su askubuntu:

risposta data Duncanmoo 03.05.2013 - 10:39
26

Anche se questa domanda è vecchia ho pensato che tutti meritassero una risposta più affidabile:

ps axo pid=,stat=

Questo emetterà due colonne delimitate da spazi bianchi, la prima delle quali è un PID e il secondo è il suo stato.

Non penso che nemmeno GNU ps fornisce un modo per filtrare per stato direttamente, ma puoi farlo in modo affidabile con awk

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

Ora hai un elenco di PID che sono zombi. Dal momento che conosci lo stato non è più necessario visualizzarlo, in modo che possa essere filtrato.

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

Fornire un elenco delimitato da una nuova riga di PID zombi.

Ora puoi operare su questo elenco con un semplice ciclo di shell

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

ps è uno strumento potente e non devi fare nulla di complicato per ottenere informazioni di processo da esso.

    
risposta data Sorpigal 25.01.2014 - 21:29
4

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

Da: link

Dai commenti uno migliorato:

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;

Attenzione però: anche questo uccide il processo.

    
risposta data Rinzwind 09.03.2012 - 11:48
1

Less is more though:

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

In pratica, dammi una foresta (albero) dei processi di tutti gli utenti in un formato orientato all'utente con larghezza illimitata su qualsiasi tty e mostramelo a metà schermo sopra dove corrisponde al caso in cui l'ottava colonna contiene un Z, e perché non evidenzia l'intera linea.

Il formato orientato all'utente sembra significare: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND in modo che lo stato di Zombi venga visualizzato nell'ottava colonna.

Puoi inserire un N prima di p se desideri i numeri di riga e un J se desideri un asterisco alla corrispondenza. Tristemente se usi G per non evidenziare la linea che l'asterisco non mostrerà, anche se J crea spazio per esso.

Finisci per ottenere qualcosa che assomiglia a:

…
  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.*
…

Puoi poter seguirlo (e verrà rilevato se il tuo terminale ama -U Unicode o -A Ascii):

pstree -psS <PID LIST>

O semplicemente, sai, usa la freccia su in less per seguire quell'albero / foresta attraverso la gerarchia; che è quello che stavo raccomandando con l'approccio "Less is more".

    
risposta data dlamblin 14.02.2018 - 11:40
0

Ti suggerisco questo comando:

ps aux | awk '"[Zz]" ~  { printf("%s, PID = %d\n", , ); }'
    
risposta data Peycho Dimitrov 04.05.2015 - 17:13
0

Per elencare gli zombi di processo, prova questo comando:

ps j | awk ' ~ "Z"'

Potrebbe essere necessario modificare a seconda del sistema operativo.

Ciò restituirà anche l'elenco dei rispettivi ID di processo genitore ( PPID ).

Per provare ad uccidere gli zombi (dopo aver provato il comando precedente), prova:

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

Per identificare i loro genitori, prova con pstree , come:

$ 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)
    
risposta data kenorb 19.02.2016 - 22:12

Leggi altre domande sui tag