Ваша kill
команда назад.
Як і багато команд UNIX, параметри, які починаються з мінусу, повинні бути першими, перш ніж інші аргументи.
Якщо ви пишете
kill -INT 0
він розглядає -INT
як варіант і надсилає SIGINT
до 0
( 0
це спеціальне число, яке означає всі процеси в поточній групі процесів).
Але якщо ти пишеш
kill 0 -INT
він бачить 0
, вирішує, що немає більше варіантів, тому використовує SIGTERM
за замовчуванням. І посилає це поточній групі процесів так само, як і ви
kill -TERM 0 -INT
(Було б також спробувати відправити SIGTERM
на -INT
, що викличе синтаксичну помилку, але він посилає SIGTERM
до 0
першого, і ніколи не отримує , що далеко.)
Отже, ваш основний сценарій - це отримання, SIGTERM
перш ніж він запускає wait
та echo DONE
.
Додайте
trap 'echo got SIGTERM' TERM
вгорі, відразу після
trap 'killall' INT
і запустіть його ще раз, щоб довести це.
Як зазначає Стефан Шазелас, ваші діти ( process1
тощо) SIGINT
за замовчуванням ігнорують .
У будь-якому випадку, я думаю, що надсилання SIGTERM
матиме більше сенсу.
Нарешті, я не впевнений, чи kill -process group
гарантовано спочатку піти до дітей. Ігнорування сигналів під час вимкнення може бути хорошою ідеєю.
Тому спробуйте це:
#!/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