쉘이 닫힐 때 SIGTERM 작업의 원인

쉘이 닫힐 때 SIGTERM 작업의 원인

쉘 스크립트 trap 'kill $(jobs -p)' EXIT전송 에서 볼 수 있습니다.신호 용어쉘이 닫히면 쉘에 대한 모든 작업이 실행됩니다. bash 스크립트를 실행하면 새로운 bash 쉘이 시작됩니다. 예를 들어, 이 사용자는 ./trap_test.shPID를 사용하여 bash 인스턴스를 실행하고 생성합니다 98959.

 | |     |-+= 05624 user /usr/local/bin/bash
 | |     | \-+= 98959 user /bin/bash ./trap_test.sh
 | |     |   \--- 98960 user sleep 10

상위 셸이 닫혀도 어떤 상황에서 작업이 계속 실행될 수 있나요? 위의 예에서 PID 98959를 종료하면 PID 98960도 자동으로 종료됩니다. trap 'kill $(jobs -p)' EXIT쉘 자체가 닫힐 때 모든 하위 프로세스가 종료되어야 하기 때문에 나에게는 쓸모가 없어 보입니다.

답변1

nohup을 사용하여 하위 프로세스가 시작되면 nohup 명령의 목적인 상위 셸 종료/다이 후에도 유지됩니다.

또 다른 가능성은 스크립트나 프로세스가 종료 신호(분명히 종료-9가 아님)를 처리하고 이를 무시하는 경우 백그라운드 작업으로 시작하면 현재 셸이 종료될 때 종료되지 않는다는 것입니다.

예:

 #!/bin/bash

 function trap_handler
 {
     echo "SORRY! I am not going down MUAHAHA!"
 }

 trap trap_handler SIGINT SIGTERM SIGHUP 

 while true
 do
      sleep 60
 done

따라서 백그라운드 작업으로 시작하고 종료하려고 하면 다음과 같은 일이 발생합니다.

 $ ps -ef | grep test &
 $ jobs
 [1]+  Running                 ./test_trap.sh &
 $ kill %1
 $ Terminated
 SORRY! I am not going down MUAHAH!

 $ jobs
 [1]+  Running                 ./test_trap.sh &

이제 다른 터미널에서 프로세스를 모니터링하고 스크립트를 시작한 터미널/셸을 종료하면 어떤 일이 일어나는지 살펴보겠습니다.

 $ pstree -clap 26163
 bash,26163
  └─test_trap.sh,26175 ./test_trap.sh
       └─sleep,26183 60
 ## exited the original terminal window with exit
 $ pstree -clap 26163
 $ 
 $ pstree -clap 26175
 test_trap.sh,26175 ./test_trap.sh
   └─sleep,26185 60

터미널 프로세스는 더 이상 존재하지 않지만 시작된 test_trap.sh의 프로세스 ID에 대해 pstree를 수행하면 해당 프로세스와 해당 하위 프로세스가 여전히 존재합니다.

관련 정보