Procesos zombies

Leyendo una entrada de elav recordé que en un foro alguien pidió ayuda ya que su sistema estaba lento, algunas de las soluciones se enfocaban en los procesos.

Los principales estados de los procesos en Linux son:
Sleeping (S) : Procesos que están esperando su turno para ejecutarse.
Running (R) : Procesos que están en ejecución.
Waiting (D) : Procesos esperando a que se finalice alguna operación de Entrada/Salida.
Zombie (Z) : Procesos que han terminado pero que siguen apareciendo en la tabla de procesos. Se pueden deber a errores de programación y pueden ser el síntoma de un sistema lento o que provoca problemas.

Un proceso Zombie es aquel que nunca recibió una señal por parte del proceso padre que lo creo, un proceso hijo es aquel que tiene su origen en un proceso de nivel superior conocido como proceso padre que es el encargado de enviar las señales a los procesos hijos generados por el mismo para indicarles que su lapso de vida ha terminado.

Se pueden deber a errores de programación y pueden ser el síntoma de un sistema lento o que provoca problemas. Esta situación suele ocurrir,también debido a que alguna configuración no fue contemplada por el desarrollador.

En la Wikipedia se puede leer más acerca de estos procesos.

Ejecutando el comando top podemos ver en tiempo real los procesos que se están ejecutando en el sistema, y nos indicara si hay alguno en estado zombie, pero no nos indica cual es.

proceso

Para verlos todos los procesos teclear en la terminal: ps aux, y para ver sólo los zombies: ps -el |grep ‘Z’o ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

alf@Alf ~ $ ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

Z 1945

Si al listar los procesos aparece alguno con estado Z, significa que es un zombie, lo cual a su vez quiere decir que la aplicación no está bien solventada o tiene bugs, sabiendo su PID  se puede eliminar  ejecutando en la terminal un comando similar a, en este ejemplo: 

alf@Alf ~ $ kill -9 1945

Cuando tienes muchos procesos zombie o al menos mas de uno, puedes usar el siguiente comando que arrasa con ellos, solo sirve para eso, si lo ejecutas sin tener procesos zombies no sucederá nada:

alf@Alf ~ $ sudo kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘ | awk ‘{print $2}’`

Saludos


14 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   proper dijo

    🙁

  2.   Oscar dijo

    Gracias,muy buen aporte, voy a guardar los comandos para hacer verificaciones periódicas.

  3.   Josh dijo

    Gracias, buen articulo.

  4.   msx dijo

    Un par de aclaraciones con respecto a tu artículo:

    El término «proceso Zombie» es técnicamente iimpropio y los que tenemos un poquito de experiencia en GNU/Linux debemos evitar usarlo ya que en sí no hay ningún proceso corriendo sino que es sólamente la referencia a un proceso que ya no existe en el sistema y que no liberó su identificador.

    Un «proceso zombie» es en realidad la entrada en la tabla de asignaciones del identificador del proceso (process descriptor), sólo eso, por lo que no consumen recursos más allá de unos pocos bytes de memoria que usa el sistema para llevar registro en la tabla de procesos.

    El único problema que puede haber con los descriptores de registro fantasma (o zombies) es que si estos spawnean demasiado rápido podrían en teoría ocupar toda la tabla de asignación de descriptores de proceso dejando al sistema sin espacio para que nuevos registros por lo que sería potencialmente imposible ejecutar nuevos programas -que registran sus procesos- eventualmente colgando la máquina.

    Sin embargo esto es casi imposible que ocurra ya que en los sistemas de 32 bits hay 32767 espacios para registrar procesos (raramente o nunca utilizados) y el doble en un sistema de 64 bits.

    La única forma de hacer que un sistema de atore con procesos muertos mal removidos es creando los procesos y matándolos rápidamente sin limpiar de forma correcta el descriptor del proceso (osea creando «procesos zombies») pero, seamos sinceros, si alguien quiere colgar un sistema hay formas mucho más directas que esa. por empezar creando nuevos proesos rápidamente de forma exponencial que atoren el sistema y lo cuelguen; una de las formas de lograr esto con una fork bomb:

    :(){ :|:& };:

    Se puede hacer que el sistema sea relativamente resistente a una fork bomb configurando correctamente /etc/security/limits.conf aunque hay que tener en cuenta que cuanto más limitemos la posibilidad de creación de nuevos procesos vamos a poder ejecutar menos aplicaciones concurrentemente en nuestro sistema, sin embargo es una herramienta válida para todo sysadmin paranoico que quiera tener un control muy fino sobre sus sistemas!

    Es artículo tiene buena info sobre descriptores de procesos inválidos:
    http://www.howtogeek.com/119815/htg-explains-what-is-a-zombie-process-on-linux/
    Y en este hay una explicación clara sobre cómo funciona una fork bomb: http://stackoverflow.com/questions/991142/how-does-this-bash-fork-bomb-work

    Salu2

    1.    Jotaele dijo

      msx: «El término “proceso Zombie” es técnicamente iimpropio y los que tenemos un poquito de experiencia en GNU/Linux debemos evitar usarlo…» Ja, ja, ja. Solo hay algo más grande que tu soberbia: tu mal gusto. Oye, es de mal gusto lo que hiciste, si quieras dar cátedra que te den una en la facultad, o pon tu propio blog y escribe lo que quieras, pero venir aquí a corregirle la plana al buen Alf de verdad es de mal gusto.

      1.    Fernando Rojas dijo

        La verdad me parecio un comentario bastante interesante. Mucho mas que el post

  5.   platonov dijo

    gracias muy interesante.

  6.   Rots87 dijo

    excelente articulo gracias

  7.   Alf dijo

    msx
    «El término “proceso Zombie” es técnicamente iimpropio y los que tenemos un poquito de experiencia en GNU/Linux debemos evitar usarlo »

    Habrá que avisarles a los desarrolladores, ya que como verás, el término zombie lo usan también, ahí lo leí en la consola.

    Saludos

  8.   Citux dijo

    Felicidades muy buen artículo, siempre había tenido duda que eran los PZ pero nunca había tenido tiempo de investigar, ahora entro a la página y me topo con la respuesta gracias…….

  9.   truko22 dijo

    En KDE con control+escape sale actividades del sistema y podemos asesinar a esos zombies rápidamente.

  10.   Rain dijo

    Una correccion, es proceso ZOMBI no ZOMBIE
    Zombie es en ingles
    Zombi en español

  11.   Elynx dijo

    De lujo, gracias!.

  12.   Roberto dijo

    Primero, el término proceso zombie parece totalmente correcto. Además el término es lo menos importante.
    El punto es que como indica msx, y la mima wikipedia (lei el artítculo) el proceso zombie esta realmente muerto.
    «Cuando un proceso acaba, toda su memoria y recursos asociados a él se desreferencian, para que puedan ser usados por otros procesos. De todas formas, la entrada del proceso en la tabla de procesos aún permanece»
    Es decir, el proceso ya no esta ocupando recursos del sistema, por lo tanto la carga para el sistema es mínima, como explica msx.
    Sin embargo lo único que tiene es una entrada inválida en la tabla de procesos….lo cual en caso de ser miles de ellas quizá si supondría una carga (después de todo el procesador tiene que leer la tabla de procesos y leería mucha información inútil) además de que refleja, malas prácticas de programación (alguien anda haciendo aplicaciones mal hechas).
    Pero en sí la explicación del post no es tan correcta y la correcta sería la dada por msx.