Tu kill
comando está al revés.
Al igual que muchos comandos de UNIX, las opciones que comienzan con un signo menos deben aparecer primero, antes que otros argumentos.
Si tú escribes
kill -INT 0
ve el -INT
como una opción y envía SIGINT
a 0
( 0
es un número especial que significa todos los procesos en el grupo de procesos actual).
Pero si escribes
kill 0 -INT
ve el 0
, decide que no hay más opciones, por lo que usa SIGTERM
de forma predeterminada. Y envía que al grupo de proceso actual, lo mismo que si lo hizo
kill -TERM 0 -INT
(que también intente enviar SIGTERM
a -INT
, lo que provocaría un error de sintaxis, pero envía SIGTERM
a 0
la primera, y nunca llega tan lejos.)
Por lo tanto, su script principal está obteniendo un SIGTERM
antes de ejecutar el wait
y echo DONE
.
Añadir
trap 'echo got SIGTERM' TERM
en la parte superior, justo después
trap 'killall' INT
y ejecutarlo nuevamente para probar esto.
Como señala Stephane Chazelas, sus hijos en segundo plano ( process1
, etc.) ignorarán SIGINT
de forma predeterminada.
En cualquier caso, creo que enviar SIGTERM
tendría más sentido.
Finalmente, no estoy seguro de si kill -process group
se garantiza ir primero a los niños. Ignorar las señales mientras se apaga puede ser una buena idea.
Así que prueba esto:
#!/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