bash에서 +를 사용하여 CtrlSIGINT에 대해 2가지 테스트를 수행했습니다 .C
테스트 1
상위 및 하위 스크립트 모두 를 통해 핸들러를 설정합니다 trap
.
# !/bin/bash
# Parent.sh
trap 'echo "I handled the SIGINT in Parent.sh and expect the script going ahead."' SIGINT
echo 1.1
./Child.sh
echo 1.2
# !/bin/bash
# Child.sh
trap 'echo "I handled the SIGINT in Child.sh and expect the script going ahead."' SIGINT
echo 2.1
sleep 1000000000
echo 2.2
/tmp:$ ./Parent.sh
1.1
2.1
^CI handled the SIGINT in Child.sh and expect the script going ahead.
2.2
I handled the SIGINT in Parent.sh and expect the script going ahead.
1.2
출력은 제가 예상했던 것과 거의 같습니다.
테스트 2
하위 스크립트만 설정 핸들러를 전달합니다 trap
.
# !/bin/bash
# Parent.sh
# trap 'echo "I expect I will be terminated immediately after Child.sh died."' SIGINT
echo 1.1
./Child.sh
echo "sleep started"
sleep 5
echo "sleep finished"
echo 1.2
# !/bin/bash
# Child.sh
trap 'echo "I handled the SIGINT in Child.sh and expect the script going ahead."' SIGINT
echo 2.1
sleep 1000000000
echo 2.2
/tmp:$ ./Parent.sh
1.1
2.1
^CI handled the SIGINT in Child.sh and expect the script going ahead.
2.2
sleep started
sleep finished
1.2
나는 Parent.sh
이것이 사망 후 즉시 종료되어야 한다고 예상했습니다(SIGINT의 기본 조치로) Child.sh
.
하지만 SIGINT를 받은 것 같지만 Parent.sh
무시합니다.
왜 그럴까요?
답변1
이런 일이 일어나는 이유는"기다리고 협력해서 나가세요"(WCE) bash
구현.
bash가 SIGINT
하위 프로세스를 기다리는 동안 신호를 받으면 해당 신호로 인해 하위 프로세스가 종료되는 경우에만(하위 프로세스가 종료될 때가 아니라) 스스로 종료됩니다. 상위 WIF*
프로세스는 하위 프로세스의 종료 상태를 통해 처리되지 않은 신호로 인해 종료되었는지 아니면 종료되었는지 확인할 수 있습니다.wait(2)
맨페이지.
더 간단한 예:
bash -c 'sh -c "trap exit INT; read p"; echo DONE'
<ctrl-C>
DONE
그리고dash
WCE를 구현하지 않는 쉘:
dash -c 'sh -c "trap exit INT; read p"; echo DONE'
<ctrl-C>
<no DONE, parent script was killed outright>