사람들은 종종 "&"가 실행을 위해 프로세스를 백그라운드에 두지만 터미널이 닫히면 프로세스가 종료된다고 말합니다. 그러나 내가 아는 한, 내가 백그라운드로 보내는 모든 것은 터미널을 닫은 후에도 오랫동안 계속 활성화됩니다. 예를 들어:
$ tail -f /var/log/messages/ &
프로세스를 시작한 사용자 아래에 다른 프로세스가 없어도 프로세스는 계속 실행되며 모든 터미널이 사라진 지 오래되었습니다. 왜 그런 겁니까?
답변1
그냥 추측해 보세요( bash
구체적임):문서huponexit
쉘 옵션 에 대해서는 다음과 같이 말합니다.
설정된 경우 Bash는 대화형 로그인 셸이 종료될 때 모든 작업에 SIGHUP을 보냅니다.
내 시스템에서는 기본적으로 설정되어 있지 않은 것 같습니다. 당신은 확인할 수 있습니다
shopt -p huponexit
출력에 -u
.
답변2
프로세스가 입력 또는 출력을 위해 터미널을 필요로 하고 그것이 존재하지 않는 것을 발견하면 nohup 대신 "&"를 사용하여 백그라운드에 배치된 프로세스가 종료됩니다. 이 경우 tail
여러 메시지가 기록될 때까지 지연되는 버퍼 문제가 있을 수 있지만 /var/log/messages에 무언가가 기록될 때 종료될 수 있습니다.
시작 프로세스를 사용하는 것은 ./foo > /dev/null 2&1 < /dev/null
nohup을 사용하여 시작하는 것과 거의 동일합니다. 기본적으로 nohup이 수행하는 작업은 터미널에서 아직 리디렉션되지 않은 입력 및 출력의 리디렉션을 처리하는 것입니다.
답변3
& 기호는 &
프로세스를 백그라운드로 둡니다. 파일 설명자(stdout, stderr, stdin)는 영향을 받지 않습니다. 쉘이 종료되면 쉘은 SIGHUP
생성된 모든 것을 전송하므로 이 쉘이 닫히면 백그라운드 프로세스가 이를 수신 SIGHUP
하고 종료될 수도 있습니다. 일부 쉘(bash, zsh)에서는 disown
쉘이 닫힐 때 전송하지 않도록 쉘에 지시하는 명령을 사용하여 이를 방지할 수 SIGHUP
있으며 프로세스는 계속 실행됩니다.
SIGSTOP
전송(보통 터미널에서 Ctrl-Z)한 다음 프로세스를 백그라운드( )하여 bg
"앰퍼샌드를 사용한 백그라운드"와 동등한 작업을 수행 할 수도 있습니다.
nohup은 SIGHUP을 무시하여 작동합니다. 이 신호 처리는 실행하는 하위 프로세스로 전달됩니다. nohup은 또한 stdout이 어디로 가는지 확인하고, 터미널로 가면 stdout과 stderr을 파일로 리디렉션합니다. 신호 처리 변경 및 가능한 리디렉션 후 백그라운드에서 프로세스를 실행합니다.
그렇다면 차이점은 무엇입니까?
백그라운드 프로세스는 이를 무시하지 않습니다 SIGHUP
. 하지만 쉘에 이를 disown으로 보내지 않도록 지시할 수는 있습니다. 차단되지 않는 한 nohup
stdout은 nohup.out 파일로 리디렉션되는데, 디스크 주위에 무작위로 흩어져 있는 nohup.out 파일을 삭제해야 할 때마다 이 파일을 사용하는 것을 싫어합니다.
또한 setsid
프로세스를 프로세스 그룹 리더로 만듭니다. 프로세스 그룹 리더는 SIGHUP
어떤 쉘에서도 전송되지 않습니다. stdout/stderr에서는 많은 작업 setsid
을 수행하지 않으며 .setsid
nohup