답변:
물고기 나 자전거가 더 낫습니까? 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 &
exec &
=> 프로세스를 백그라운드 프로세스로 실행하므로 다른 작업에 동일한 터미널을 계속 사용할 수 있습니다.
nohup
=>는 모든 SIGHUP (종료 신호)을 피하고 터미널이 닫혀 있어도 실행을 계속합니다.
exec
a SIGHUP
가 수신 되면 프로세스가 종료 되지만 nohup
프로세스는 계속됩니다.
exec
실행중인 프로세스를 대체하지만 &
exec'd 명령을 백그라운드로 사용 하는 경우에는 발생하지 않는 것 같습니다 . bash 나 zsh에는 없습니다.
exec smth &
와 동일 (exec smth) &
합니까?
(exec smth) &
. 그러나 나는 그것이 같을 것으로 기대하지 않을 것입니다-구문 오류 일 것으로 기대합니다. 프로세스를 어떻게 수행하고 (자신을 대체) 어떻게 실행 된 프로세스를 배경으로 할 수 있습니까? 더 이상 할 일이 없습니다.
쉘 내장 명령 exec <command>
은 쉘을 <command>
새 프로세스가없고 새 PID가 작성되지 않은 것으로 대체합니다 . <command>
정상적으로 완료되면 터미널이 닫힙니다. 백그라운드에서 먼저 실행하면 서브 쉘이 작성되고 그와 유사하게 즉시 셸로 대체됩니다 <command>
.
이 nohup <command>
명령은 실행 <command>
되지만 끊기 (kill -s 1)를 수행 하지 않으므로 명령 이 시작된 터미널 인 셸을 닫을 때 종료되지 않습니다. 백그라운드에서 먼저 실행하면 서브 쉘이 작성되고 백그라운드에서 명령이 실행되어 프롬프트로 돌아갑니다.
스크립팅에서 즉각적인 효과는 다소 비슷하지만 <command>
스크립트에 의해 시작되며 스크립트는 <command>
시작, 출력 전송 또는 완료를 기다리지 않고 계속 됩니다.
script.sh &
또는 수행하는 것 사이의 사소한 차이 만 볼 수 있습니다 exec script.sh &
. 두 경우 모두 명령이 하위 프로세스에서 실행되며 호출 프로세스를 대체하지 않습니다. paste.alacon.org/44474 (여기에 주석으로 복사하기에는 너무 깁니다)를 참조하십시오 . 내가 무엇을 잘못하고 있지?