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


67

nohup바이너리 인 경우 모든 쉘에서 도달 할 수 있다는 것을 알고 있습니다. 그러나 exec내장은 아마도 모든 쉘에 존재할 것입니다.

둘 중 하나를 선호하는 이유가 있습니까?

답변:


113

물고기 나 자전거가 더 낫습니까? nohup그리고 exec다른 일을.

exec쉘을 다른 프로그램으로 대체합니다. 사용 exec: 간단한 백그라운드 작업에 유용하지 않습니다 exec myprogram; more stuff와 쉘을 대체 myprogram실행되지 않습니다 그래서와 more stuff는 달리, myprogram; more stuff어떤 실행 more stuffmyprogram종료; 하지만 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 &

27
자전거> 물고기
크리스 제인스

6
나는달라고 간청한다. 생선을 구현할 수 있다면 분명히 교통 수단이 우수합니다.
이 사용자에게 도움이 필요합니다

6
@THISUSERNEEDSHELP 그러나 자전거가 더 좋은 음식일까요?
Gilles

3
@GypsyCosmonaut을 실행 한 후에 exec firefox는 셸이 더 이상 실행되지 않습니다 firefox. exec프로그램 종료를 결합하고 새 프로그램을 시작하지만 동일한 프로세스 ID를 유지하는 것으로 생각할 수 있습니다 . 터미널은 아무것도 말라고 말한 없기 때문에 실행 유지합니다. 나중에 Firefox를 firefox종료 하면 프로세스가 종료됩니다. 터미널은 자식 프로세스가 종료되었다는 것을 알게되어 차례로 종료됩니다.
Gilles

5
한 남자에게 물고기를 주면 하루 동안 그에게 먹이를줍니다. 한 남자에게 자전거를 주면 슈퍼마켓까지 자전거를 타고 평생 생선을 살 수 있습니다.
David

18

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

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

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


1
이 답변은 올바른 것 같습니다. 위의 다른 답변에서 말했듯이 일반적으로 exec실행중인 프로세스를 대체하지만 &exec'd 명령을 백그라운드로 사용 하는 경우에는 발생하지 않는 것 같습니다 . bash 나 zsh에는 없습니다.
Dan Pritts

@ DanPritts 무슨 일이 일어나지 않습니까? 백그라운드 하위 프로세스가 시작된 다음 교체되었으므로 exec smth &와 동일 (exec smth) &합니까?
phk

1
나는 보통 (현재 실행중인 쉘을 대체) 생각할 것이라는 의미에서 실행되지 않는다는 것을 의미합니다-그것은 단지 백그라운드 프로세스로 실행됩니다. 아마 아마 같은 것 같아요 (exec smth) &. 그러나 나는 그것이 같을 것으로 기대하지 않을 것입니다-구문 오류 일 것으로 기대합니다. 프로세스를 어떻게 수행하고 (자신을 대체) 어떻게 실행 된 프로세스를 배경으로 할 수 있습니까? 더 이상 할 일이 없습니다.
Dan Pritts

2

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

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

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


나도 exec가 무엇을하는지 잘 모르겠다. 내 말은 ..해야 할 일을 이해하지만 script.sh &또는 수행하는 것 사이의 사소한 차이 만 볼 수 있습니다 exec script.sh &. 두 경우 모두 명령이 하위 프로세스에서 실행되며 호출 프로세스를 대체하지 않습니다. paste.alacon.org/44474 (여기에 주석으로 복사하기에는 너무 깁니다)를 참조하십시오 . 내가 무엇을 잘못하고 있지?
Stéphane

2

nohup와 (과) 비교할 수 없습니다 exec. 로 실행 파일을 실행 nohup하면 로그 아웃 (ssh 세션)시 프로세스가 종료되지 않습니다. 일반적으로 우선 순위가 낮은 프로세스를 실행 nohup하는 데 사용됩니다 nice. HUP신호는, 일반적으로이 방법은 단말의 종속 아웃 처리를 경고한다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.