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.
Respuestas:
La única forma de deshacerse de un zombie es hacer que su padre
wait()
sea capaz de informar su estado de salida. Puede hacerlo enviandoSIGCHLD
al 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ó
SIGCHLD
a 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-p
opció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 siemprewait()
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 enviarSIGCHLD
ainit
, pero realmente no debería tener que hacer eso, y si eso no funciona, su único recurso es reiniciar porque su sistemainit
está 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:
(para este ejemplo, digamos que el zombie es PID 3101 y el padre es PID 3100)
gdb
yattach
al padre:attach 3100
waitpid
al zombie:call waitpid(3101,0,0)
detach
) y salir del depurador.(Este es un rifle de francotirador afinado).
fuente
waitpid()
nunca se me ocurrió. Soy un terrible ex programador ...call waitpid
nunca vuelve para mí¿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).
fuente