あなたの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
これを証明するためにもう一度実行します。
Stephane Chazelasが指摘しているように、背景の子供(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