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