답변:
물고기 나 자전거가 더 낫습니까? 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.
nohupSIGHUP 신호를 무시하고 특정 프로그램을 실행합니다. 터미널이 닫히면 커널은 SIGHUP을 해당 터미널의 제어 프로세스 (예 : 셸)로 보냅니다. 쉘은 백그라운드에서 실행중인 모든 작업에 SIGHUP을 보냅니다. nohup터미널을 죽인 경우 (예 : 원격으로 로그인하여 연결이 끊어 지거나 터미널 에뮬레이터를 닫는 경우) 이런 식으로 작업을 실행하면 작업 이 종료되지 않습니다.
nohup또한 프로그램의 출력을 파일로 리디렉션합니다 nohup.out. 이렇게하면 출력 또는 오류 출력에 쓸 수 없으므로 프로그램이 죽지 않습니다. 주 nohup입력을 리디렉션하지 않습니다. 프로그램을 시작한 터미널에서 프로그램을 완전히 분리하려면
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec & => 프로세스를 백그라운드 프로세스로 실행하므로 다른 작업에 동일한 터미널을 계속 사용할 수 있습니다.
nohup =>는 모든 SIGHUP (종료 신호)을 피하고 터미널이 닫혀 있어도 실행을 계속합니다.
execa 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 (여기에 주석으로 복사하기에는 너무 깁니다)를 참조하십시오 . 내가 무엇을 잘못하고 있지?