Eliminar un proceso zombie de la tabla de procesos

8

Tengo un proceso zombie molesto que es adoptado por init, y no desaparecerá. He leído que hay una manera de crear un proceso ficticio, adjuntar al zombie como hijo de ese nuevo proceso y luego matarlo, eliminándolo de la tabla de procesos.

¿Cómo haría eso, precisamente?

Y sí, he leído la mayoría de estas cosas:

Un proceso zombie ya está muerto, por lo que no se puede matar.

O

Deberías reiniciar tu sistema

Y

Los procesos de zombis no usan ningún recurso, solo debes dejar que sean

Desafortunadamente, muchos programas revisan la tabla de procesos para ver si una instancia ya se está ejecutando, y se negarán a iniciar una nueva si hay una entrada en la tabla de procesos.

Y reiniciar cada vez que mi conexión SSHFS se cae, llevar a Sublime con él, es un poco tonto.

skerit
fuente
77
... con una escopeta. ;)
Nathan C
+1, porque miré a la página principal y vi "kill zombie"
HopelessN00b

Respuestas:

16

La única forma de deshacerse de un zombie es hacer que su padre wait()sea ​​capaz de informar su estado de salida. Puede hacerlo enviando SIGCHLDal padre, suponiendo que el padre esté escrito correctamente.

Si tiene zombis, generalmente significa que el padre NO está escrito correctamente (porque el niño ya se lo envió SIGCHLDa su padre cuando murió y se convirtió en un zombi), por lo que el siguiente paso es matar al padre.
Una herramienta como pstree(con la -popción) puede mostrarle el linaje de sus zombis para que sepa qué proceso es el padre.
Cuando el padre muere, el zombi será adoptado por init, lo que siempre wait()significa que los niños mueran, y felizmente matará a todos los zombis que adopte.

Si el proceso principal es en realidad init(PID 1) ya está en una situación que nunca debería suceder. Puede intentar enviar SIGCHLDa init, pero realmente no debería tener que hacer eso, y si eso no funciona, su único recurso es reiniciar porque su sistema initestá dañado y no está haciendo su trabajo.

(Estas son las opciones de "escopeta").


A algunas personas más creativas que a mí también se les ocurrió esta opción si quieres evitar matar el proceso principal:

  1. Determine los PIDS de los procesos zombie y padre
    (para este ejemplo, digamos que el zombie es PID 3101 y el padre es PID 3100)
  2. Encienda gdby attachal padre:
    attach 3100
  3. Llama waitpidal zombie:
    call waitpid(3101,0,0)
  4. Separarse del padre ( detach) y salir del depurador.

(Este es un rifle de francotirador afinado).

voretaq7
fuente
1
je, gran respuesta. Rifle "Mosin" allí mismo.
Danila Ladner
1
@DanilaLadner Ojalá pudiera tomar el crédito, pero hasta que hice una pequeña búsqueda en Google para ver qué significaba skerit sobre "vincular al zombie como hijo de un proceso ficticio", la idea de usar el depurador para forzarme waitpid()nunca se me ocurrió. Soy un terrible ex programador ...
voretaq7
call waitpidnunca vuelve para mí
deFreitas
0

¿Por qué te preocupan los procesos zombis? Los recursos que mantienen atados son mínimos (espacio para una tarea de estructura de esqueleto, un PID y no mucho más). Claro, es indecoroso, pero eso es todo. Busque a sus padres y corríjalos, reemplácelos por alternativas mejor escritas (podrían tener otros efectos secundarios beneficiosos), infórmelos como errores (que ciertamente son).

vonbrand
fuente