nohup과 앰퍼샌드의 차이점은 무엇입니까


243

둘 다 nohup myprocess.out &또는 myprocess.out &myprocess.out을 백그라운드에서 실행하도록 설정하십시오. 터미널을 종료 한 후에도 프로세스가 여전히 실행 중입니다. 그들 사이의 차이점은 무엇입니까?


어떤 쉘을 사용하고 있습니까? 동작은 쉘마다 다릅니다
shx2

1
세게 때리다. 그리고 나는 왜 @nemo의 대답에 따라 지금 알고 있습니다.
Yarkee

@Yarkee 답변이 문제에 적합하면 질문을 수락 된 것으로 표시하십시오 (답 표 아래의 확인란). 당신은 모든 질문에 대해 그렇게해야합니다 :)
nemo

1
shutdown특정 Linux 의미의 용어로 사용하지 말아야하며로 대체해야합니다 exit.
Patrizio Bertoni

답변:


317

nohupman 7 signal앰퍼샌드가 수행하지 않는 동안 훅업 신호를 포착합니다 ( SIGHUP).

일반적으로 &쉘을 사용한 후 명령을 실행 한 후 쉘은 행업 신호 ( kill -SIGHUP <pid>)를 사용하여 하위 명령을 종료합니다 . nohup신호를 포착하고 무시하여 실제 응용 프로그램에 도달하지 않기 때문에이를 사용하여 방지 할 수 있습니다 .

bash를 사용하는 경우 명령 shopt | grep hupon을 사용 하여 쉘이 SIGHUP을 하위 프로세스로 보낼지 여부를 찾을 수 있습니다 . 꺼져 있으면 프로세스가 종료되지 않습니다. bash가 응용 프로그램을 종료하는 방법에 대한 자세한 내용은 여기를 참조하십시오 .

경우가 있습니다 nohup과정은 당신이 재접속에게 시작할 때, 예를 들어, 작동하지 않습니다 SIGHUP는 경우와 같이, 신호를 여기가 .


&부속 명령이 일부 신호 (예 : SIGINT)를 수신하지 못하게하는 것은 가치 가 있습니다. 전파되지 않은 신호 목록에 nohup기본적으로 추가 SIGHUP됩니다.
studgeek

46

myprocess.out &서브 쉘을 사용하여 백그라운드에서 프로세스를 실행합니다. 현재 셸이 종료되면 (예 : 로그 아웃) 모든 하위 셸도 종료되므로 백그라운드 프로세스도 종료됩니다. nohup을의 명령은 무시 HUP신호를 현재 쉘이 종료하여도, 서브 쉘과는 myprocess.out백그라운드에서 계속 실행됩니다. 또 다른 차이점은 &단독으로는 stdout / stderr를 리디렉션하지 않으므로 출력이나 오류가 있으면 터미널에 표시됩니다. 반면에 nohup은 stdout / stderr을 nohup.out또는로 리디렉션합니다 $HOME/nohup.out.


6
myprocess.out &쉘을 실행 하고 종료합니다. 그러나 ps aux | grep myprocess.out다른 쉘에서 사용할 때 여전히 "myprocess.out"을 찾을 수 있습니다. 프로세스가 여전히 실행 중이며 종료되지 않았 음을 의미합니다.
Yarkee

1
@amit_g 부모 쉘을 죽일 때 kill -9SIGHUP은 없을 것입니다. SIGHUP은 SIGKILL을 처리하기 위해 부모 쉘이 필요합니다.
nemo

2
쇼핑 체크 | 다른 답변에서 언급했듯이 grep hupon.
amit_g 2016 년

31

대부분의 경우 ssh를 사용하여 원격 서버에 로그인합니다. 쉘 스크립트를 시작하고 로그 아웃하면 프로세스가 종료됩니다. Nohup은 쉘에서 로그 아웃 한 후에도 백그라운드에서 스크립트를 계속 실행하는 데 도움이됩니다.

Nohup command name &
eg: nohup sh script.sh &

Nohup은 HUP 신호를 포착합니다. Nohup은 백그라운드에서 작업을 자동으로 넣지 않습니다. &를 사용하여 명시 적으로 알려 주어야합니다.


감사. 대답을 기대하지 않았지만 여기에 있다는 사실은 훌륭합니다. 그것은 내가 묻지 않은 질문에 대답합니다 : D
Vaibhav Kaushal

26

앰퍼샌드 (&)를 사용하면 하위 프로세스 (현재 하위 세션의 하위 프로세스)에서 명령이 실행됩니다. 그러나 세션을 종료하면 모든 하위 프로세스가 종료됩니다.

nohup + 앰퍼샌드 (&)를 사용하면 세션이 종료 될 때 하위 프로세스의 상위 프로세스가 "초기"프로세스 인 "1"로 변경되어 하위 프로세스가 종료되는 것을 제외하고 동일한 작업을 수행합니다.


7

틀 렸으면 말해줘

  nohup myprocess.out &

nohup 은 행업 신호를 포착하여 터미널을 닫을 때 프로세스를 보냅니다.

 myprocess.out &

프로세스는 실행될 수 있지만 터미널이 닫히면 중지됩니다.

nohup myprocess.out

터미널을 닫은 상태에서도 프로세스를 실행할 수 있지만 터미널에서 ctrl+ z를 눌러 프로세스를 중지 할 수 있습니다. Crt+ 존재 z하는 경우 작동하지 않습니다 &.


2

nohup 명령은 신호 마스킹 유틸리티이며 행업 신호를 포착합니다. 앰퍼샌드가 끊기 신호를 포착하지 못하는 경우. 쉘은 &를 사용하여 명령을 실행하고 쉘을 종료 할 때 정지 신호로 부속 명령을 종료합니다. 이것은 신호를 포착하기 때문에 nohup을 사용하여 방지 할 수 있습니다. Nohup 명령은 커널에 의해 프로세스로 전송 될 수있는 끊기 신호를 받아 들여 차단합니다. Nohup 명령은 사용자가 오래 실행되는 응용 프로그램 로그 아웃을 시작하거나 프로세스가 시작된 창을 닫고 싶을 때 유용합니다. 이러한 조치 중 하나는 일반적으로 커널이 응용 프로그램에서 전화를 끊도록 프롬프트하지만 nohup 랩퍼는 프로세스를 계속할 수있게합니다. 앰퍼샌드를 사용하면 자식 프로세스와 현재 bash 세션의이 자식에서 명령이 실행됩니다. 세션을 종료하면 해당 프로세스의 모든 하위 프로세스가 종료됩니다. 앰퍼샌드는 활성 쉘의 작업 제어와 관련이 있습니다. 백그라운드의 세션에서 프로세스를 실행하는 데 유용합니다.


0

환경의 작은 차이가 당신을 물 수있는 경우가 많이 있습니다. 이것은 내가 최근에 실행 한 것입니다. 이 두 명령의 차이점은 무엇입니까?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

대답은 평소와 동일합니다.

nohup은 앰퍼샌드가 아닌 동안 끊기 신호를 포착합니다.

끊기 신호 란 무엇입니까?

SIGHUP-제어 터미널에서 제어 중단 또는 제어 프로세스의 사망이 감지되었습니다 (값 : 1).

일반적으로 &를 사용하여 명령을 실행하고 나중에 쉘을 종료하면 쉘은 정지 신호 (kill -SIGHUP $ PID)와 함께 부속 명령을 종료합니다. nohup을 사용하면 신호를 포착하고 무시하여 실제 응용 프로그램에 도달하지 않으므로 무시할 수 있습니다.

좋아, 그러나이 경우처럼 항상 '그러나'이 있습니다. 쉘이 SIGHUP을 전혀 보내지 않는 방식으로 쉘을 구성 할 때 이러한 실행 방법에는 차이가 없습니다.

bash를 사용하는 경우 아래 지정된 명령을 사용하여 쉘이 SIGHUP을 하위 프로세스로 보내는 지 여부를 찾을 수 있습니다.

~ $ shopt | grep hupon

또한 nohup이 작동하지 않는 경우가 있습니다. 예를 들어, 프로세스가 시작되면 NOHUP 신호가 다시 연결됩니다 (응용 프로그램 코드 레벨에서 내부에서 수행됨).

설명 된 경우, 사용자 정의 서비스 시작 스크립트 내부에서 nohup 명령없이 적절한 응용 프로그램을 설정하고 시작하는 두 번째 스크립트가 호출되면 차이가 없습니다.

하나의 Linux 환경에서는 모든 것이 원활하게 작동하고 두 번째 스크립트에서는 두 번째 스크립트가 종료되는 즉시 응용 프로그램이 종료됩니다 (이 경우를 감지하면 시간이 훨씬 많이 걸리므로 : stuck_out_tongue :).

두 번째 스크립트에 실행 방법으로 nohup을 추가 한 후에는 스크립트가 종료되고 두 환경에서이 동작이 일관된 경우에도 응용 프로그램이 계속 실행됩니다.

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