No, cuando matas un proceso solo, no matará a los niños.
Tienes que enviar la señal al grupo de procesos si desea que todos los procesos de un grupo determinado reciban la señal
Por ejemplo, si su identificación de proceso principal tiene el código 1234, deberá especificar la identificación principal agregando el símbolo menos seguido de la identificación de su proceso principal:
kill -9 -1234
De lo contrario, los huérfanos se vincularán a init
, como se muestra en la tercera captura de pantalla (el PPID del niño se ha convertido en 1).
-bash:kill:(-123) - No existe tal proceso
En una sesión interactiva de Terminal.app, el número de identificación del grupo de procesos en primer plano y el número de identificación del grupo de procesos en segundo plano son diferentes por diseño cuando el modo de control/supervisión del trabajo está habilitado. En otras palabras, si pone en segundo plano un comando en una sesión de Terminal.app habilitada para el control de trabajos, el $!
pid del proceso en segundo plano es, de hecho, un nuevo número de identificación de grupo de proceso (pgid).
Sin embargo, en un script que no tiene habilitado el control de trabajos, ¡este puede no ser el caso! ¡El pid del proceso en segundo plano puede no ser un pgid nuevo sino un pid normal! Y esto es lo que provoca el mensaje de error -bash: kill: (-123) - No such process
, tratando de eliminar un grupo de procesos pero solo especificando un pid normal (en lugar de un pgid) para el kill
comando.
# 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
}