이것은 Bash 질문보다 프로세스 관리/신호 처리 질문에 가깝습니다. 문제를 설명하기 위해 Bash를 사용합니다.
백그라운드 프로세스를 실행하는 Bash 스크립트를 실행하고 있습니다. 스크립트는 다음과 같습니다.
#!/bin/bash
# ...
# The background process
{
while :; do
sleep 1 && echo foo >> /path/to/some/file.txt
done
} &
# ...
exit 0
나는 백그라운드에서 스크립트 자체를 실행하지 않습니다. 간단하게 ./script
.
"huponexit" 셸 옵션은 를 사용하여 활성화되므로 shopt -s huponexit
터미널이 닫힐 때 HUP 신호를 Bash로 보내 백그라운드 프로세스에 도달할 때까지 전파할 것으로 예상됩니다. 백그라운드 프로세스가 trap
신호를 무시하지 않고 무시하면 해당 프로세스도 종료되지만 이는 발생하지 않습니다. 백그라운드 프로세스는 마치 disown
'ed'된 것처럼 작동합니다.
이것은 문제를 설명하기 위해 제가 그리는 계획입니다. 위의 설명과 함께 이 계획은 내가 주제를 충분히 이해하지 못했기 때문에 잘못되었을 수 있습니다. 그것이 정말로 사실이라면 그 점을 고쳐주세요.
마치 대화형 셸에서 호출한 것처럼 터미널을 닫은 후에도 백그라운드 프로세스가 종료되지 않는 이유를 알고 싶습니다.
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
확실하지는 않지만 내 질문에 대한 대답은 작업 제어 및 신호 처리에 대해 다른 규칙 세트가 있을 수 있는 스크립트를 실행하기 위한 Bash fork()sa 비대화형 쉘이라는 사실에 있다고 생각합니다.
답변1
그러면 매뉴얼 페이지는 우리에게 무엇에 대해 말해주는가 huponexit
?
huponexit 쉘 옵션이 shopt로 설정된 경우 bash는 다음과 같은 경우 모든 작업에 SIGHUP을 보냅니다.대화형 로그인쉘이 종료됩니다.
편집 : LOGIN 쉘임을 강조합니다.
편집 2: 대화형도 똑같이 강조할 가치가 있습니다