이 이상한 동작이 발생했습니다 trap
.
~에 따르면트랩 맨페이지:
무시되지 않는 트랩은 서브쉘에 들어갈 때 기본 동작으로 설정됩니다. 이는 새 트랩을 설정하기 위해 하위 쉘에서 Trap 명령을 사용할 수 없다는 의미는 아닙니다.
내가 설명하는 방법은 다음과 같습니다.
- 스크립트가 신호 A를 포착하면 해당 하위 쉘도 신호 A를 포착하지만 기본 조치를 취합니다.
- 서브셸은 동일한 신호를 포착하기 위해 다른 작업을 지정할 수도 있습니다.
내 이해를 테스트하기 위해 두 가지 스크립트가 있습니다.
outerscript.sh
#!/bin/bash
trap "echo SIGINT in outer" SIGINT
echo PID of outer process: $$
echo -----------;
./innerscript.sh
innerscript.sh
#!/bin/bash
echo start inner script
echo PID of inner process: $$
trap "SIGINT in inner, do graceful shutdown" SIGINT
sleep 10s
echo done inner process
그런 다음 외부 스크립트를 실행하면 ./outerscript.sh
외부 스크립트가 내부 스크립트를 호출하고 그림과 같이 하위 쉘을 생성합니다.
SIGINT
수면 명령 중에 다음 과 같이 보냅니다.kill -SIGINT <pid>
PID 결과는 수신된 신호에 따라 달라집니다.
수신된 신호의 PID는 외부 표준 PID입니다.
여전히 sleep 명령이 완료될 때까지 기다려야 합니다.
done inner process SIGINT in outer
수신 신호의 PID는 내부 스크립트의 PID입니다.
여전히 sleep 명령이 완료될 때까지 기다려야 합니다.
SIGINT: command not found done inner process
PID 수신 신호는 슬립 신호입니다.
sleep 명령이 완료될 때까지 기다릴 필요가 없습니다.
done inner process
질문
2)의 경우 이런 오류가 발생하는 이유는 무엇인가요? 나는 내부 스크립트가 트랩 기능을 트리거할 것으로 예상했습니다.
3)의 경우 내부 스크립트의 트랩 기능을 트리거하는 이유는 무엇입니까? 나는 그것이 스스로 종료되고 정상적으로 내부 스크립트 프로세스로 돌아갈 것으로 예상했습니다.
답변1
질문이 2개 있습니다. 사례 2의 오류는 시스템에 SIGINT라는 명령이 없기 때문에 발생합니다. OP는
trap "SIGINT in inner, do graceful shutdown" SIGINT
그러나 아마도 필요한 명령은
trap "echo SIGINT in inner, do graceful shutdown" SIGINT
또 다른 질문은 내부 스크립트 트랩 기능이 호출된 이유를 물었는데, 그렇지 않습니다. 잠자는 프로세스가 종료되고 스크립트가 다음 줄로 이동합니다.