¿Cómo encontrar el proceso de 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
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:~$ 

¿Cómo encontrar ese proceso zombie?

    
pregunta Pablo 09.03.2012 - 11:44

6 respuestas

101

Para matar a un zombie (proceso) tienes que matar a su proceso principal (¡como zombies reales!), pero la pregunta era cómo encontrarlo.

Encuentra al zombi (La pregunta respondió esta parte):

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

Lo que obtienes es Zombies y cualquier otra cosa con Z, así que también obtendrás el 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

Encuentra el padre del zombi:

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

Te dará:

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

En este caso no quieres matar a ese proceso principal y deberías estar bastante contento con un zombie, pero matar al proceso primario inmediato 5145 debería deshacerse de él.

Recursos adicionales en askubuntu:

respondido por el Duncanmoo 03.05.2013 - 10:39
26

Aunque esta pregunta es antigua, pensé que todos merecían una respuesta más confiable:

ps axo pid=,stat=

Esto emitirá dos columnas delimitadas por espacios en blanco, la primera de las cuales es un PID y la segunda es su estado.

No creo que ni siquiera GNU ps proporcione una forma de filtrar por estado directamente, pero puedes hacer esto de manera confiable con awk

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

Ahora tienes una lista de PID que son zombies. Como ya conoce el estado, ya no es necesario mostrarlo para que pueda filtrarse.

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

Dar una lista delimitada por línea nueva de PID zombi.

Ahora puede operar en esta lista con un simple bucle de shell

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

ps es una herramienta poderosa y no necesita hacer nada complicado para obtener información del proceso.

    
respondido por el Sorpigal 25.01.2014 - 21:29
4

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

De: enlace

De los comentarios uno mejorado:

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;

Sin embargo, cuidado: este también mata el proceso.

    
respondido por el Rinzwind 09.03.2012 - 11:48
1

Menos es más:

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

Es como, dame un bosque (árbol) de todos los procesos de los usuarios en un formato orientado al usuario con ancho ilimitado en cualquier tty y muéstramelo a la mitad de una pantalla donde coincide con el caso de que la octava columna contenga un Z, y por qué no resaltar toda la línea.

El formato orientado al usuario parece significar: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND para que el estado Zombie aparezca en la 8va columna.

Puedes agregar un N antes del p si quieres números de línea, y un J si quieres un asterisco en el partido. Lamentablemente, si utiliza G para no resaltar la línea que asterisco no se mostrará, aunque J crea espacio para ello.

Terminas obteniendo algo que se ve así:

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

Usted podría seguir con esto (y detectará si su terminal tiene gusto -U Unicode o -A Ascii):

pstree -psS <PID LIST>

O simplemente, ya sabes, use la flecha hacia arriba en less para seguir ese árbol / bosque a través de la jerarquía; que es lo que estaba recomendando con el enfoque "Menos es más".

    
respondido por el dlamblin 14.02.2018 - 11:40
0

Te sugiero este comando:

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

Para ver zombies de proceso, prueba este comando:

ps j | awk ' ~ "Z"'

Es posible que deba cambiar según su sistema operativo.

Esto también devolverá la lista de sus id. de proceso padre ( PPID ).

Para tratar de matar a los zombies (después de probar el comando anterior), intente:

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

Para identificar a sus padres, prueba con pstree , como:

$ 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)
    
respondido por el kenorb 19.02.2016 - 22:12

Lea otras preguntas en las etiquetas