추가 읽기

추가 읽기

nohup에 대한 수많은 스택 교환 답변이 있습니다. 다음은 참고용으로 몇 가지입니다.
분기에 "&"를 사용한 경우 언제 "nohup"이 필요합니까?
"exec &" 대신 "nohup &"를 사용하는 이유

정식 답변은 nohup을 사용하면 터미널이 닫힐 때 프로세스가 종료되는 것을 방지한다는 것입니다. 따라서 다음과 같은 명령은
nohup mycommand >& mycommand_output.txt &
다음에 로그인할 때 계속 실행되며 나중에 확인할 수 있도록 출력을 저장합니다.

그러나 일부 키 입력을 저장하면
mycommand >& mycommand_output.txt &
다음에 로그인할 때 여전히 실행 중입니다.

그것을 막기 위해 사용할 수 있다는 점에서 nohup과 다릅니다 kill -HUP. 다시 로그인하면 ps -x해당 프로세스의 TTY가 현재 로 표시되어 ?해당 프로세스가 아직 터미널에 연결되지 않은 상태입니다.

쉘을 종료해도 프로세스가 중지되지 않는 이유는 무엇입니까?
nohup을 사용하지 않으면 프로세스가 종료되지 않을 것이라고 안전하게 가정할 수 있습니까?

혹시라도 내 현재 환경에는 Ubuntu 시스템에서 Debian 시스템으로의 SSH 연결이 포함됩니다.

답변1

쉘을 종료해도 프로세스가 중지되지 않는 이유는 무엇입니까?

아마도 당신이 쉘에 disown그것에 대해 말했기 때문일 것입니다. 또는 세션 부팅 프로세스로 대화형 작업 제어 셸을 사용하지 않을 수도 있습니다.

1980년대에 세계적으로 정착된 세션 + 프로세스 그룹 결합 모델은 다음과 같이 작동합니다.회의 주최자프로세스. 이것이 바로 터미널에서 끊김 신호를 받는 이유입니다.라인 규율터미널이 끊겼을 때. 이는 해당 신호를 증폭시켜 생성된 모든 "작업"에 신호를 보낼 것으로 예상됩니다. 인터렉티브직업 통제쉘은 이를 수행할 수 있습니다. 대부분의 다른 프로그램은 미팅 호스트 임무를 수행하기를 원하지 않으며 그렇지 않습니다.

세션 리더가 중단 신호를 보낼 때 nohup이러한 "작업"의 프로세스가 중단 신호를 무시하도록 하는 데 사용됩니다. 을 사용하면 disown세션 리더 셸이 작업을 잊어버리게 되므로 처음부터 중단 신호를 보내지 않습니다.

nohup을 사용하지 않으면 프로세스가 종료되지 않을 것이라고 안전하게 가정할 수 있습니까?

아니요. 교육을 받지 못했다면 disown그들은~ 할 것이다끊기 신호는 세션 리더 대화식 작업 제어 쉘 프로세스에 의해 전송됩니다.

또한 시스템 사람들은 커널 세션과 동등한 사용자 공간 메커니즘을 구현하려고 시도했지만 몇 가지 시도를 했고 이로 인해 (일부) 시스템 운영 체제가 더욱 복잡해졌습니다. systemd 세션이 중단되면 SIGHUP커널의 연결 규칙처럼 세션 리더에게만 전송되는 것이 아니라 다음 SIGTERM으로 잘못 전송됩니다.모두프로세스, 잘못 표현됨폐쇄대신에끊다.

SIGTERM물론 표준 세션 + 프로세스 그룹 모델에서 모든 프로세스에 대해 시스템이 종료되면 어떤 일이 발생합니까? 이로 인해 거부된 프로세스와 중단 신호를 무시한 프로세스를 포함한 모든 프로세스가 종료됩니다. 물론 disown편집도 편집도 하지 않는 프로세스도 종료됩니다.nohup

추가 읽기

답변2

nohup을 사용하지 않으면 프로세스가 종료되지 않을 것이라고 안전하게 가정할 수 있습니까?

습관. 터미널이 중단되고 세션 리더로 대화형 쉘이 있는 경우 쉘은 SIGHUP을 수신하여 거부되지 않은 작업에 다시 보냅니다.

쉘이 자발적으로 종료되고 이 huponexit옵션이 켜져 있으면 해당 작업에 SIGHUP을 보냅니다.

쉘이 자발적으로 종료되고 중지된 자체 작업이 있는 경우 bash는 SIGTERM을 사용하여 해당 작업을 종료합니다(이것이 표준 동작인지 확실하지 않음).

쉘이 자발적으로 종료되고 소유되지 않은 작업이 중지된 경우 터미널 드라이버는 SIGHUP을 통해 해당 작업을 종료합니다(이는 표준에서 절대적으로 필요합니다).

따라서 다양한 상황에서 SIGHUP에 의해 여전히 사망할 수 있습니다.

즉 nohup 소스코드를 보면http://src.gnu-darwin.org/src/usr.bin/nohup/nohup.c.html, 순수 쉘에서는 어느 정도 작동하는 것 같습니다.

nohup_sh()
(
    set -e
    if [ -t 1]; then
        exec >> nohup.out || exec >> "$HOME/nohup.out"
    fi
    if [ -t 0 ]; then
        exec 0</dev/null
    fi
    if [ -t 2 ]; then
        exec 2>&1
    fi
    trap '' HUP #ignore SIGHUP (inheritable)
    set -m || : #to prevent SIGINT and SIGQUIT from being ignored
    #(probably not needed, but the nohup binary won't ignore them, unlike
    # & without set -m)

    command "$@" &
)

아마도 그 이상의 추가 항목은 필요하지 않을 것입니다 trap '' HUP. 작업이 연결이 끊긴 터미널에 쓰려고 하면(리디렉션으로 인해 방지됨) SIGPIPE를 받게 됩니다.

관련 정보