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

¿Cómo encontrar ese proceso zombie?

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

Encuentra al zombie (La pregunta contestó esta parte):

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

Lo que obtienes es Zombies y cualquier otra cosa con una 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 al padre del zombie:

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

Te regalaré:

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

En este caso, no desea eliminar ese proceso principal y debería estar muy contento con un zombi, pero al eliminar el proceso primario inmediato 5145 debería deshacerse de él.

Recursos adicionales en askubuntu:

  • ¿Qué son los procesos zombie?
  • ¿Hay alguna forma de matar un proceso zombie sin reiniciar?

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 incluso GNU ps proporcione una manera de filtrar por estado directamente, pero puedes hacerlo de manera confiable con awk

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

Ahora una lista de PIDs que son zombies. Como ya sabe el estado, ya no es necesario mostrarlo, por lo que se puede filtrar.

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

Dando una lista delimitada de nueva línea de PID zombies.

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

 for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; 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.

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

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

De los comentarios uno mejorado:

 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; 

Pero cuidado: éste también mata el proceso.

Aunque menos es más:

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

Eso 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éstrame en la mitad de la pantalla de arriba donde coincide con el caso de que la 8ª columna contiene una 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 por lo que el estado de Zombie se mostrará en la 8ª columna.

Puedes lanzar una N antes de la p si quieres números de línea, y una J si quieres un asterisco en la partida. Lamentablemente, si usa G para no resaltar la línea que no se mostrará con un asterisco, J crea espacio para ella.

Terminas obteniendo algo que se parece 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  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.* … 

Puedes seguir con (y detectará si a tu terminal le gusta -U Unicode o -A Ascii):

 pstree -psS  

O simplemente, ya sabes, usa 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”.

Te sugiero este comando:

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

Para listar zombies de proceso, prueba este comando:

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

Es posible que deba cambiar $7 dependiendo de su sistema operativo.

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

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

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

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

 $ 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)