Si la secuencia de comandos se ejecuta bien desde la línea de comandos, ¿por qué la misma secuencia de comandos se convierte en estado zombie después de ejecutar a través de cron y cómo solucionará el mismo?
Aquí siguiendo el ejemplo real:
[root@abc ~]# ps ax | grep Z
23880 ? Zs 0:00 [checkloadadv.sh] <defunct>
23926 pts/0 S+ 0:00 grep Z
[root@abc ~]# strace -p 23880
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
[root@abc ~]# pstree | grep checkload
init-+-crond---crond-+-checkloadadv.sh
[root@abc ~]# bash /usr/bin/checkloadadv.sh
System Load is OK : 0.05
process
zombie-process
Rahul Patil
fuente
fuente
Respuestas:
Al igual que los zombis reales, un proceso zombie no se puede matar, porque ya está muerto.
Como sucede
Cuando en Linux / Unix un proceso muere / finaliza, toda la información del proceso se elimina de la memoria del sistema, solo queda el descriptor del proceso. El proceso entra en el estado Z (zombie). Su proceso padre recibe una señal del núcleo:
SIGCHLD
eso significa que uno de sus procesos hijos sale, se interrumpe o se reanuda después de ser interrumpido (en nuestro caso, simplemente sale).El proceso padre ahora necesita ejecutar la
wait()
llamada al sistema para leer el estado de salida y otra información de su proceso hijo. Luego, el descriptor se elimina de la memoria y el proceso ya no es un zombie.Si el proceso padre nunca llama a la llamada al
wait()
sistema, el descriptor del proceso zombie permanece en la memoria y come cerebros. Normalmente no ves procesos zombies, porque el procedimiento anterior lleva menos tiempo.El amanecer de los muertos
Cada descriptor de proceso necesita una cantidad muy pequeña de memoria, por lo que algunos zombis no son muy peligrosos (como en la vida real). Un problema es que cada proceso zombie mantiene su identificación de proceso, y un sistema operativo Linux / Unix tiene un número limitado de pid. Si un software programado incorrectamente genera muchos procesos zombies, puede suceder que los procesos ya no puedan iniciarse porque no hay más identificadores de proceso disponibles.
Entonces, si están en grandes grupos, son muy peligrosos (como en muchas películas se demuestra muy bien)
¿Cómo podemos defendernos de una horda de zombis?
Un disparo en la cabeza funcionaría, pero no sé el comando para eso (SIGKILL no funcionará porque el proceso ya está muerto).
Bueno, puedes enviar SIGCHLD a través de kill al proceso padre, pero cuando ignora esta señal, ¿qué sucede entonces? Su única opción es matar el proceso padre y que el proceso init "adopte" al zombi. Init llama periódicamente al
wait()
syscall para limpiar a sus hijos zombis.En tu caso
En su caso, debe enviar SIGCHLD al proceso crond:
Luego desde otra terminal:
El resultado es:
Verá que la
wait4()
llamada al sistema devuelve -1 ECHILD, lo que significa que no hay ningún proceso secundario. Entonces la conclusión es: cron reacciona a la llamada al sistema SIGCHLD y no debe forzar el apocalipsis.fuente
Si el subproceso principal se elimina antes que el subproceso secundario, todos los subprocesos secundarios se convertirán en procesos zombies.
fuente