¿Por qué no podemos matar a un zombie?

¿Por qué no podemos matar a un zombie?

Estoy editando esta pregunta ya que fue marcada como duplicada como otra pregunta sobre cómo eliminar un proceso zombie.

No estoy buscando una respuesta sobre cómo matar un proceso zombie. No tengo zombis en mi sistema y sé cómo se crean los zombis.

Permítanme intentar reformular la pregunta. Actualmente, estos son los métodos aceptados para eliminar un zombie:

  • Enviando SIGCHLD al padre. Funciona en teoría, no siempre en la práctica, ya que una de las razones por las que se creó el zombi en primer lugar podría ser porque el padre no respondía adecuadamente a SIGCHLD.

  • Matar el proceso padre.

  • Arreglando el error en el programa que creó el Zombie.
  • Reiniciando.
  • O como se menciona enaquí

  • O por este motivo mencionado por @richard en los comentarios a mi pregunta antes de esta edición:

    ..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.

Ahora mis preguntas son:

  • ¿Por qué no existe un método sencillo y directo para limpiar un zombi o zombis?

  • ¿Cuáles serían los efectos secundarios/consecuencias si se hubiera podido matar al zombi con una señal?

  • ¿Qué impide que los mantenedores de *NIX creen una SEÑAL o un comando (mis disculpas, si la frase 'crear una nueva señal' no es tecnológicamente aceptable) que limpia a un zombie?

Respuesta1

El proceso ya está muerto en ese momento. No tiene sentido matarlo de nuevo. Todavía se registra en la tabla de procesos para permitir que el padre pueda determinar su estado.

Tenga en cuenta que todos los procesos se convierten en zombis después de ser asesinados. Simplemente no los ve porque la mayoría de los procesos principales limpian a sus hijos muy rápidamente. Es posible que desees presentar un informe de error si un software no limpia a sus zombis y estos solo se limpian medianteen esouna vez que sale el proceso padre.

Su pregunta adicional es por qué SIGKILLno lo elimina de la tabla de procesos. Primero deberías decirnos por qué debería hacerlo. No conozco ninguna razón para permitir que el usuario elimine un proceso inactivo de la tabla de procesos. En el diseño de un sistema operativo, siempre se debe tener unabuena razón para hacer algoantes de preguntarPor qué no hacerlo. Estás solicitando una función sin un caso de uso real.

Aparte de la falta de propósito, tendría malas consecuencias. El padre llama wait()y/o waitpid()para conocer el estado de los niños que salieron. El resultado de la llamada es consistente ya sea que se llame antes de que el proceso se convierta endifunto, antes de emitir el SIGKILL, o después de eso.

Si el núcleo no mantuviera los registros (es decir, el proceso sería eliminado de la tabla de procesos), el comportamiento tendría que ser inconsistente y el padre tendría que esperar la inconsistencia y afrontarla sin ninguna razón válida. En sistemas que reutilizarían viejospidvalores, no mantener los registros podría resultar en problemas mucho más graves, como que un software mate un proceso completamente diferente por accidente.

Ver también:http://en.wikipedia.org/wiki/Zombie_process

información relacionada