2012-01-05 2 views
0

bash에서 신호 처리를 설명하는 샘플 코드를 이해하려고합니다. 예제 32-7의 http://tldp.org/LDP/abs/html/debugging.html에서 작성자의 주석은 그가 SIGINT를 캡처하고 있지만 트랩은 EXIT를위한 것이라고 설명합니다.백그라운드 프로세스에서 SIGINT 트래핑

 
{ 
    trap "exit" SIGUSR1 
    sleep $interval; sleep $interval 
    while true; do 
     ... 
    done; } &   # Start a progress bar as a background process. 

pid=$! 
trap "echo !; kill -USR1 $pid; wait $pid" EXIT  # To handle ^C. 

이유 EXIT의 트랩은 SIGINT CTL (-C)에 대한 배경 처리로 정확한 신호 (SIGUSR1)를 전송 하는가?

이 기능이 왜 효과가 있는지에 대한 도움을 주시면 감사하겠습니다.

답변

0

EXIT 의사 신호가 정상 종료에 모두 발생하고 스크립트가 중단 될 때이 질문을 오해.

+1

아니요, 프로세스가'exit (2)'자체를 호출 할 때만입니다 (스크립트의 끝이나 명시 적 'exit' 명령). – fge

+0

맞아,이 스크립트는 제대로 처리하기 위해'trap 'exit 127'2 15'와 같은 것이 있어야합니다. – tripleee

+0

아. 알았다. 추가 테스트를 한 후 키보드 인터럽트에서 INT 트랩이 수행 된 후 EXIT 트랩이 발생했음을 알았습니다. – user1131035

1

EXIT은 bash의 trap에서 특별한 처리기입니다. 신호가 아닙니다. 이탈 신호가 없습니다. 이 트랩은 bash 프로세스가 종료 될 때마다 실행됩니다. 따라서 사용자가 bash 프로세스를 죽이면 SIGUSR1이 백그라운드 프로세스로 전송되며, 백그라운드 프로세스는 트랩 된 후 해당 프로세스에서 'exit'를 실행합니다. 그렇게하면 세션을 종료해도 백그라운드 프로세스가 영원히 지속되지 않고 끝나기도합니다 (아마도 주석이 설명하려고하는 내용 일 것입니다).

편집 : 내 원래의 응답

+0

또한이 코드를 오해하고 있습니다. 의사 신호 'EXIT'에 대한 트랩이 마지막 줄에 명확하게 설정되어 있습니다. 이것은 Bash에서 exit 핸들러를 생성합니다. 그러나 코드는 불완전하다. – tripleee

+0

... 실제로 스크립트는 장시간 실행되는 일부 명령으로 계속됩니다 (링크 참조). – tripleee

+0

@ @tripleee 당신은 절대적으로 옳았습니다! 나는 코드의 마지막 줄을 처리하지도 않았다! 내 대답을 편집 할 것입니다 (위의 코드가 완료되었습니다) –

관련 문제