로그아웃 시 SIGHUP이 작업으로 전송되지 않는 경우는 무엇입니까?

로그아웃 시 SIGHUP이 작업으로 전송되지 않는 경우는 무엇입니까?

실행 중이라고 주장하는 사용자의 답변을 읽었습니다.

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

관련 정보