您的kill
命令是向后的。
像许多UNIX命令一样,以减号开头的选项必须先于其他参数。
如果你写
kill -INT 0
它把-INT
视为一个选项,然后发送SIGINT
给0
(0
是一个特殊数字,表示当前进程组中的所有进程)。
但是如果你写
kill 0 -INT
它会看到0
,决定没有更多选项,因此SIGTERM
默认使用。并将该当前进程组,因为如果你做了同样的
kill -TERM 0 -INT
(它还会尝试发送SIGTERM
到-INT
,这会导致语法错误,但它先发送SIGTERM
到0
,再也不会走那么远了。)
因此,您的主脚本SIGTERM
在运行wait
and 之前先获取了一个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