No, quando uccidi un processo da solo, non ucciderà i bambini.
Devi inviare il segnale al process group se vuoi che tutti i processi di un dato gruppo ricevano il segnale
Ad esempio, se l'id del tuo processo genitore ha il codice 1234, dovrai specificare il parentpid aggiungendo il simbolo meno seguito dall'id del tuo processo genitore:
kill -9 -1234
Altrimenti, gli orfani saranno collegati a init
, come mostrato dal tuo terzo screenshot (il PPID del bambino è diventato 1).
-bash:kill:(-123) - Nessun processo simile
In una sessione interattiva di Terminal.app, il numero di ID del gruppo di processi in primo piano e il numero di ID del gruppo di processi in background sono diversi in base alla progettazione quando è abilitata la modalità di controllo/monitoraggio del processo. In altre parole, se esegui lo sfondo di un comando in una sessione Terminal.app abilitata al controllo dei processi, il $!
pid del processo in background è in realtà un nuovo numero id del gruppo di processi (pgid).
In uno script che non ha il controllo del lavoro abilitato, tuttavia, questo potrebbe non essere il caso! Il pid del processo in background potrebbe non essere un nuovo pgid ma un normale pid! E questo è ciò che causa il messaggio di errore -bash: kill: (-123) - No such process
, tentando di uccidere un gruppo di processi ma specificando solo un normale pid (invece di un pgid) al 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
}