쉘 스크립트 trap 'kill $(jobs -p)' EXIT
전송 에서 볼 수 있습니다.신호 용어쉘이 닫히면 쉘에 대한 모든 작업이 실행됩니다. bash 스크립트를 실행하면 새로운 bash 쉘이 시작됩니다. 예를 들어, 이 사용자는 ./trap_test.sh
PID를 사용하여 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를 수행하면 해당 프로세스와 해당 하위 프로세스가 여전히 존재합니다.