Il tuo kill
comando è al contrario.
Come molti comandi UNIX, le opzioni che iniziano con un segno meno devono venire prima, prima di altri argomenti.
Se scrivi
kill -INT 0
vede l' -INT
opzione come e invia SIGINT
a 0
( 0
è un numero speciale che significa tutti i processi nel gruppo di processi corrente).
Ma se scrivi
kill 0 -INT
vede il 0
, decide che non ci sono più opzioni, quindi utilizza SIGTERM
per impostazione predefinita. E manda che al gruppo processo corrente, lo stesso come se avete fatto
kill -TERM 0 -INT
(proverebbe anche a inviarlo SIGTERM
a -INT
, il che provocherebbe un errore di sintassi, ma invia SIGTERM
per 0
primo e non arriva mai così lontano.)
Quindi il tuo script principale sta ottenendo un SIGTERM
prima di poter eseguire il wait
e echo DONE
.
Inserisci
trap 'echo got SIGTERM' TERM
in alto, subito dopo
trap 'killall' INT
ed eseguirlo di nuovo per dimostrarlo.
Come sottolinea Stephane Chazelas, i tuoi figli in background ( process1
, ecc.) Ignoreranno SIGINT
per impostazione predefinita.
In ogni caso, penso che l'invio SIGTERM
avrebbe più senso.
Infine, non sono sicuro che kill -process group
sia garantito per prima cosa andare dai bambini. Ignorare i segnali durante lo spegnimento potrebbe essere una buona idea.
Quindi prova questo:
#!/bin/bash
trap 'killall' INT
killall() {
trap '' INT TERM # ignore INT and TERM while shutting down
echo "**** Shutting down... ****" # added double quotes
kill -TERM 0 # fixed order, send TERM not INT
wait
echo DONE
}
./process1 &
./process2 &
./process3 &
cat # wait forever