Non, lorsque vous tuez un processus seul, il ne tuera pas les enfants.
Vous devez envoyer le signal au groupe de processus si vous voulez que tous les processus d'un groupe donné reçoivent le signal
Par exemple, si votre identifiant de processus parent a le code 1234, vous devrez spécifier le parentpid en ajoutant le symbole moins suivi de votre identifiant de processus parent :
kill -9 -1234
Sinon, les orphelins seront liés à init
, comme le montre votre troisième capture d'écran (le PPID de l'enfant est devenu 1).
-bash :kill :(-123) - Aucun processus de ce type
Dans une session Terminal.app interactive, le numéro d'identification du groupe de processus de premier plan et le numéro d'identification du groupe de processus d'arrière-plan sont différents de par leur conception lorsque le mode de contrôle/surveillance des tâches est activé. En d'autres termes, si vous mettez en arrière-plan une commande dans une session Terminal.app activée pour le contrôle des tâches, le $!
Le pid du processus en arrière-plan est en fait un nouveau numéro d'identification de groupe de processus (pgid).
Dans un script n'ayant aucun contrôle de travail activé, cependant, cela peut ne pas être le cas ! Le pid du processus en arrière-plan peut ne pas être un nouveau pgid mais un pid normal ! Et c'est ce qui cause le message d'erreur -bash: kill: (-123) - No such process
, en essayant de tuer un groupe de processus mais en spécifiant uniquement un pid normal (au lieu d'un pgid) au kill
commande.
# 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
}