실행 중이라고 주장하는 사용자의 답변을 읽었습니다.
foo 2>&1 >& output.log &
foo
로그오프하더라도 계속 실행됩니다. 사용자에 따르면 SSH 연결을 통해서도 이 작업을 수행할 수 있습니다.
SSH 연결을 끊거나 TTY를 종료하면 쉘과 해당 프로세스가 SIGHUP을 수신하여 종료될 것이라는 인상을 받았기 때문에 나는 이것을 정말로 믿지 않습니다. 내 가정에 따르면 이것이 이 경우 or 등을 nohup
사용하는 유일한 이유 입니다 tmux
.screen
그러다가 조사했는데glibc 매뉴얼:
이 신호는 또한 세션과 관련된 작업에 터미널의 제어 프로세스 종료를 보고하는 데 사용됩니다. 이 종료는 제어 터미널에서 세션의 모든 프로세스를 효과적으로 연결 해제합니다.
이것이 내 생각을 확증해주는 것 같다. 하지만 좀 더 자세히 살펴보면,그것은 말한다:
프로세스가 제어 터미널의 세션 리더인 경우 SIGHUP 신호가 포그라운드 작업의 각 프로세스로 전송되고 제어 터미널은 세션에서 연결이 해제됩니다.
그렇다면 이는 백그라운드에 배치된 작업이아니요SIGHUP을 받으셨나요?
나를 더 혼란스럽게 만들기 위해 대화형 Zsh 세션을 실행하고 실행 yes >& /dev/null &
하고 입력하는 중이었습니다 exit
. 이 시점에서 Zsh는 작업을 실행 중이라고 경고했고 exit
두 번째 입력 후에는 작업이 SIGHUPd되었다고 말했습니다. Bash에서 똑같은 작업을 수행하면 작업이 계속 실행됩니다.
답변1
Bash는 SIGHUP
수신할 때만 보내는 것으로 보입니다 SIGHUP
. 이는 예를 들어 가상 터미널이 닫히거나 SSH 연결이 중단될 때 발생할 수 있습니다. ~에서문서:
기본적으로 쉘은 SIGHUP을 수신한 후 종료됩니다. 대화형 셸은 종료하기 전에 실행 중이거나 중지된 모든 작업에 SIGHUP을 다시 보냅니다. 중지된 작업은 SIGHUP을 수신할 수 있도록 SIGCONT로 전송됩니다. 쉘이 특정 작업에 SIGHUP 신호를 보내는 것을 방지하려면 disown 내장 함수를 사용하여 작업 테이블에서 해당 신호를 제거하거나(작업 제어 내장 함수 참조) disown -h를 사용하여 수신하지 않도록 표시하십시오. 한숨.
따라서 +를 입력 exit
하거나 누르면 Bash에 끊기 신호를 보내지 않으므로 모든 백그라운드 프로세스가 유지됩니다.CtrlD
Bash가 여전히 실행 중인 백그라운드 프로세스가 있음을 경고하도록 강제할 수 있습니다.
shopt -s checkjobs
SIGHUP
대화형 셸에 있는 경우 종료 시 메시지를 보내도록 선택할 수 있습니다(이봐). 하지만 내 Bash 4.2.25 시스템에서는 작동하지 않습니다. 어쩌면 너한테 어울릴지도 몰라
shopt -s huponexit