나는 nohup
바이너리 파일로서 어떤 쉘에서도 접근할 수 있다는 것을 알고 있습니다. 그러나 exec
내장 기능은 모든 쉘에 존재할 수 있습니다.
다른 것보다 하나를 선택하는 이유가 있습니까?
답변1
물고기와 자전거 중 어느 것이 더 낫습니까? nohup
그리고 exec
다른 일을 해보세요.
exec
쉘을 다른 프로그램으로 교체하십시오. exec
간단한 백그라운드 작업에서는 많이 사용되지 않습니다. exec myprogram; more stuff
셸을 로 바꾸면 myprogram
실행되지 않습니다 more stuff
. 이는 종료 시 실행되는 것과 다르지만 myprogram; more stuff
처럼 백그라운드에서 시작되고 실행됩니다.more stuff
myprogram
exec myprogram & more stuff
myprogram
more stuff
myprogram & more stuff
nohup
지정된 프로그램을 실행하고 SIGHUP 신호를 무시합니다. 터미널이 닫히면 커널은 해당 터미널(즉, 셸)의 제어 프로세스에 SIGHUP을 보냅니다. 셸은 백그라운드에서 실행 중인 모든 작업에 SIGHUP을 차례로 보냅니다. nohup
터미널이 정지된 경우(예를 들어 원격으로 로그인하고 연결이 끊어졌거나 터미널 에뮬레이터를 닫은 경우 발생할 수 있음) 작업을 실행하면 이러한 방식으로 터미널이 종료되는 것을 방지할 수 있습니다.
nohup
또한 프로그램의 출력을 파일로 리디렉션합니다 nohup.out
. 이렇게 하면 출력을 쓸 수 없거나 잘못된 출력으로 인해 프로그램이 종료되는 것을 방지할 수 있습니다. 이는 nohup
입력을 리디렉션하지 않는다는 점에 유의하세요. 프로그램을 실행한 터미널에서 프로그램의 연결을 완전히 끊으려면 다음을 사용하세요.
nohup myprogram </dev/null >myprogram.log 2>&1 &
답변2
exec &
=> 해당 프로세스를 백그라운드 프로세스로 실행하면 동일한 터미널을 계속 사용하여 다른 작업을 수행할 수 있습니다.
nohup
=> 모든 SIGHUP(종료 신호)을 피하고 터미널이 닫혀 있어도 계속 실행하세요.
exec
SIGHUP
a가 수신되면 프로세스가 종료되지만 nohup
프로세스는 계속됩니다.
답변3
쉘 내장 명령은 exec <command>
쉘을 로 대체하고 <command>
새 프로세스가 없으며 새 PID가 생성되지 않습니다. 일반적으로 터미널은 완료되면 <command>
닫힙니다 . 백그라운드에서 실행하면 먼저 하위 쉘이 생성되고 유사하게 즉시 <command>
.
명령 은 nohup <command>
실행되지만 <command>
정지되지 않으므로(kill -s 1) 명령을 시작한 터미널 쉘이 닫힐 때 종료되지 않습니다. 먼저 백그라운드에서 실행하여 하위 쉘을 만든 다음 명령이 백그라운드에서 실행되어 프롬프트로 돌아갑니다.
스크립팅에서 즉각적인 효과는 거의 동일하며 <command>
스크립트에 의해 시작되고 스크립트는 <command>
시작, 출력 전송 또는 완료를 기다리지 않고 계속됩니다.
답변4
nohup
를 exec
사용하여 실행 파일을 실행할 nohup
때는 nohup
이 작업을 nice
수행 할 수 없습니다 . 관례적으로 이 HUP
신호는 문제의 프로세스에 로그아웃을 경고하는 터미널의 방법입니다.