이는 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()가 스크립트를 실행하는 비대화형 셸이며 다른 작업 제어 및 신호 처리 규칙 세트가 있을 수 있다는 것입니다.
답변1
그러면 매뉴얼 페이지는 우리에게 무엇을 말해주는가 huponexit
?
shopt를 사용하여 huponexit 쉘 옵션이 설정된 경우 bash는 다음과 같은 경우 모든 작업에 SIGHUP을 보냅니다.대화형 로그인쉘이 종료됩니다.
편집: 로그인 쉘임을 강조했습니다.
편집 2: 상호작용도 동등한 관심을 받을 가치가 있습니다