당신의 kill명령은 거꾸로 있습니다.
많은 UNIX 명령과 마찬가지로 마이너스로 시작하는 옵션이 다른 인수보다 먼저 나와야합니다.
당신이 쓰는 경우
kill -INT 0
-INT옵션으로 보고 전송 SIGINT합니다 0( 0현재 프로세스 그룹의 모든 프로세스를 의미하는 특수 번호).
하지만 글을 쓰면
kill 0 -INT
이 표시되고 0더 이상 옵션이 없다고 결정하므로 SIGTERM기본적으로 사용 됩니다. 그리고 보내는 것을 당신이 한 것과 같은, 현재 프로세스 그룹에
kill -TERM 0 -INT
(또한 전송 시도 할 것이다 SIGTERM에 -INT구문 오류가 발생할 것이다, 그러나 그것은 전송 SIGTERM에 0첫번째, 멀리 것을 얻을 수 없다.)
따라서 주 스크립트는 and SIGTERM를 실행하기 전에를 받고 있습니다.waitecho 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