2011-12-16 11 views
18

Alguien me dijo que cuando matabas un proceso parental en Linux, el niño moría.
Pero lo dudo. Así que escribí dos scripts bash, donde father.sh invocaría child.sh¿Por qué el proceso hijo todavía está vivo después de que se matara el proceso principal en Linux?

Aquí está mi guión:

enter image description here

Ahora ejecutar bash father.sh, se puede comprobar que ps -alf enter image description here

Luego mató al father.sh por kill -9 24588, y supuse que el proceso hijo debería finalizar, pero desafortunadamente estaba equivocado. enter image description here

¿Alguien podría explicar por qué?

THX

+5

Creo que podría cortar el 80% del texto y todas las imágenes y aún así mantener todo lo que importa en esta pregunta. – ndemou

Respuesta

26

No, cuando se mata a un proceso por sí solo, no va a matar a los niños.

usted tiene que enviar la señal al grupo proceso si desea que todos los procesos de un grupo determinado para recibir la señal

kill -9 -parentpid 

De lo contrario, los huérfanos serán vinculados a init, como lo demuestra su tercer captura de pantalla (PPID del niño se ha convertido en 1).

+0

Donde 'thepidhere' es generalmente el PID del proceso principal, pero se puede averiguar con seguridad usando' ps -eo "% p% r% c% a" '. +1. –

+0

El ID del grupo de procesos es el mismo que el ID principal. ¿Puedes dar más detalles sobre cómo detenerlos? –

+13

Solo para aclarar el comando de fge en caso de que no sea obvio, estás pasando el id principal como un número negativo, p. si el padre pid es 1234, quiere matar -1234 – frankc

4

-bash: kill: (-123) - No existe el proceso de

En una sesión interactiva Terminal.app el grupo de procesos en primer plano número de identificación y el proceso de fondo Identificación del número de grupo son diferentes por diseño cuando el trabajo el modo control/monitor está habilitado. En otras palabras, si utiliza un comando de fondo en una sesión de Terminal.app habilitada para control de trabajos, el pid $! del proceso de fondo es de hecho un nuevo número de identificación de grupo de proceso (pgid).

Sin embargo, en una secuencia de comandos sin control de trabajo habilitado, puede que no sea así. ¡El pid del proceso de fondo puede no ser un nuevo pgid sino un pid normal! Y esto es, lo que causa el mensaje de error -bash: kill: (-123) - No such process, tratando de matar a un grupo de procesos pero solo especificando un pid normal (en lugar de una pgid) para el comando kill.

# the following code works in Terminal.app because $! == $pgid 
{ 
sleep 100 & 
IFS=" " read -r pgid <<EOF 
$(ps -p $! -o pgid=) 
EOF 
echo $$ $! $pgid 
sleep 10 
kill -HUP -- -$! 
#kill -HUP -- -${pgid} # use in script 
} 
+0

Esto responde a una ** pregunta ** totalmente diferente – ndemou

+0

Pero en realidad explicó mi problema :) – astrojuanlu

2
pkill -TERM -P <ProcessID> 

Esto matará a los dos padres, así como los niños

5

matar Generalmente los padres también mata al niño.

La razón por la que está viendo al niño aún vivo después de matar al padre es porque el niño solo morirá después de que decida manejar el evento SIGKILL. No tiene que manejarlo de inmediato. Su secuencia de comandos ejecuta un comando sleep(), que no se activará para controlar ningún evento hasta que se complete la suspensión.

¿Por qué es PPID # 1? El padre ha muerto y ya no está en la mesa de proceso. child.sh no es vinculado inexplicablemente para iniciar ahora. Simplemente no tiene un padre en ejecución.Decir que está vinculado a init crea la impresión de que si de alguna manera abandonamos init, ese init tiene control sobre el cierre del proceso. También crea la impresión de que matar a un padre hará que el abuelo sea el dueño de un hijo. Ambos no son verdaderos Ese proceso hijo todavía existe en la tabla de procesos y se está ejecutando, pero no se manejarán eventos nuevos basados ​​en su ID de proceso hasta que maneje SIGKILL. Lo que significa que el niño es un pre zombie, un muerto viviente, en peligro de ser etiquetado.

Matar en el grupo de procesos es diferente, y se usa para matar a los hermanos y el padre por el grupo de procesos #. Probablemente también sea importante tener en cuenta que "matar a un proceso" no es "matar" per se, a la manera humana, donde se espera que el proceso se destruya y que toda la memoria vuelva como si nunca hubiera existido. Simplemente envía un evento particular, entre muchos, al proceso para que lo maneje. Si el proceso no lo maneja adecuadamente, luego de un tiempo, el sistema operativo vendrá y lo "limpiará" a la fuerza.

It (kill) no ocurre inmediatamente porque el niño (o incluso el padre) podría haber escrito algo en el disco y esperar a que I/O complete o realizar alguna otra tarea crítica que pueda comprometer la estabilidad del sistema o integridad del archivo

+0

Beracah, parece que acabas de confabular toda tu respuesta. La respuesta aceptada es correcta, y los dejo con este enlace: http://man7.org/linux/man-pages/man7/signal.7.html y cito "Las señales SIGKILL y SIGSTOP no se pueden capturar, bloquear ni ignorar " – ALL

+0

Incorrecto nuevamente. TODO, claramente no sabes lo que significa esa cita. Te aclararé, ya que aparentemente solo lees las páginas man de Linux, como si Linux fuera el origen de la señalización UNIX. El proceso NO TIENE LA OPCIÓN de hacer algo con SIGKILL y SIGSTOP. El proceso todavía está dando vueltas porque KERNEL, actualmente está manejando E/S u otro código de controlador principal en nombre del proceso. Ese código no ha regresado y el proceso está bloqueado. No está en estado RUN. No tiene la opción de hacer nada con esos eventos. No solo reenvíe páginas man como el evangelio. – Beracah

Cuestiones relacionadas