명령이 완료되어 트랩된 SIGHUP을 수신하는 동안 bash가 즉시 종료되는 이유는 무엇입니까?

명령이 완료되어 트랩된 SIGHUP을 수신하는 동안 bash가 즉시 종료되는 이유는 무엇입니까?

Bash 매뉴얼에서

Bash가 명령이 완료되기를 기다리고 트랩이 설정되었다는 신호를 받으면 명령이 완료될 때까지 트랩이 실행되지 않습니다.

Bash가 wait 내장 함수를 통해 비동기 명령을 기다릴 때 트랩 세트가 있는 신호를 수신하면 wait 내장 함수가 128보다 큰 종료 상태로 즉시 반환된 다음 즉시 트랩을 실행하게 됩니다.

첫 번째 문장에 대해 몇 가지 실험을 해봤습니다.

  1. lxterminal 탭에서 실행 중인 쉘에서:

    $ trap "echo hello" HUP
    $ sleep 100
    

    그런 다음 SIGHUP이 셸로 전송되도록 "x" 아이콘을 클릭하여 탭 창을 닫습니다.

    쉘은 sleep 100완료를 기다린 다음 트랩을 실행하는 대신 즉시 종료됩니다. 이유를 알고 싶습니다. 내가 놓친 게 무엇입니까?

  2. 이것은 작동합니다

    $ trap -p
    trap -- 'echo hello' SIGHUP
    $ echo $$
    19708
    $ sleep 100
    

    그런 다음 lxterminal의 다른 탭에서 실행하십시오.

    $ kill -HUP 19708
    $
    

    첫 번째 탭의 sleep 명령이 완료되면:

    $ sleep 100
    hello
    

감사해요.

관련된터미널에 ctrl-c를 입력할 때 포그라운드 작업이 완료되기 전에 종료되지 않는 이유는 무엇입니까?

답변1

첫 번째 예에서 "x" 아이콘을 클릭하여 터미널 에뮬레이터 창을 닫으면 SIGHUP이 제어 터미널(예: 셸)로 전송됩니다.

터미널 에뮬레이터 창이 닫히지만 쉘은 종료되지 않고 완료될 sleep 100때까지 계속 실행된 sleep 100다음 쉘이 SIGHUP 트랩을 실행합니다. 의 출력에서는 이를 찾을 수 있지만 ps닫힌 터미널 에뮬레이터 창에서는 찾을 수 없습니다.

관련 정보