"exec &" 대신 "nohup &"를 사용하는 이유

"exec &" 대신 "nohup &"를 사용하는 이유

나는 nohup바이너리이기 때문에 어떤 쉘에서도 접근할 수 있다는 것을 알고 있습니다. 그러나 exec내장된 기능은 아마도 모든 쉘에 존재할 것입니다.

그 중 하나를 다른 것보다 선호하는 이유가 있나요?

답변1

물고기와 자전거 중 무엇이 더 낫나요? nohup그리고 exec다른 일을 합니다.

exec쉘을 다른 프로그램으로 대체합니다. exec간단한 백그라운드 작업에서 사용하는 것은 유용하지 않습니다. 종료 시 실행되는 것과 달리 exec myprogram; more stuff셸을 로 대체하므로 myprogram실행되지 않습니다 . 하지만 처럼 백그라운드에서 시작한 다음 실행됩니다 .more stuffmyprogram; more stuffmore stuffmyprogramexec myprogram & more stuffmyprogrammore stuffmyprogram & more stuff

nohupSIGHUP 신호를 무시하고 특정 프로그램을 실행합니다. 터미널이 닫히면 커널은 해당 터미널(예: 셸)의 제어 프로세스에 SIGHUP을 보냅니다. 그러면 쉘은 백그라운드에서 실행 중인 모든 작업에 SIGHUP을 보냅니다. 작업을 실행하면 nohup터미널이 종료되는 경우(예: 원격으로 로그인하여 연결이 끊어지는 경우 또는 터미널 에뮬레이터를 닫는 경우) 이러한 방식으로 작업이 종료되는 것을 방지할 수 있습니다.

nohup또한 프로그램의 출력을 파일로 리디렉션합니다 nohup.out. 이렇게 하면 출력이나 오류 출력에 쓸 수 없기 때문에 프로그램이 종료되는 것을 방지할 수 있습니다. 입력을 리디렉션하지 않습니다 nohup. 프로그램을 실행한 터미널에서 프로그램의 연결을 완전히 끊으려면 다음을 사용하세요.

nohup myprogram </dev/null >myprogram.log 2>&1 &

답변2

exec &=> 프로세스를 백그라운드 프로세스로 실행하므로 다른 작업에 동일한 터미널을 계속 사용할 수 있습니다.

nohup=> 모든 SIGHUP(종료 신호)을 피하고 터미널이 닫혀도 계속 실행됩니다.

execSIGHUP프로세스는 a가 수신 되면 종료되지만 nohup프로세스는 계속됩니다.

답변3

쉘 내장 명령은 exec <command>쉘을 로 대체하며 <command>, 새 프로세스가 없으며 새 PID가 생성되지 않습니다. 정상적으로 완료되면 <command>터미널이 닫힙니다. 먼저 백그라운드에서 실행하면 하위 셸이 생성되고 유사하게 즉시 <command>.

명령 은 nohup <command> 실행되지만 <command>중단(kill -s 1)되지 않으므로 명령이 시작된 터미널인 셸이 닫힐 때 명령이 종료되지 않습니다. 먼저 백그라운드에서 실행하면 하위 쉘이 생성되고 명령이 백그라운드에서 실행되어 프롬프트로 돌아갑니다.

스크립팅에서 즉각적인 효과는 거의 동일하지만 <command>스크립트에 의해 시작되고 스크립트는 <command>시작, 출력 전송 또는 완료를 기다리지 않고 계속됩니다.

답변4

nohup와는 비교할 수 없습니다 exec. 를 사용하여 실행 파일을 실행하면 nohup로그아웃(ssh 세션)해도 프로세스가 종료되지 않습니다. 일반적 으로 낮은 우선순위로 프로세스를 실행하는 데 nohup사용됩니다 . nice신호 HUP는 관례적으로 터미널이 종속 프로세스의 로그아웃을 경고하는 방식입니다.

관련 정보