이미 '&'를 사용하여 분기하는 경우 'nohup'이 필요한 경우는 언제입니까?


26

먼저이 질문은 관련이 있지만 분명히이 좋은 질문과 동일하지는 않습니다.

nohup, disown 및 &의 차이점

나는 무언가를 이해하고 싶다 : '&'를 할 때, 나는 올바르게 분기하고 있습니까?

"nohup ... &"을하는 것이 유용한가요? 아니면 간단하고 충분합니까?

누군가 '&'를 사용하고 여전히 'nohup'을 사용하려는 경우를 보여줄 수 있습니까?


1
허용 된 답변과 해당 주석 스레드를 읽었습니까? 그들은 무엇을 설명합니다 nohup. 어떤 부분이 혼란 스러웠습니까?
Gilles 'SO- 악마 그만해'

3
@Gilles : 그것은 자명 할 수 있습니다 당신 이 시작을 위해, 나는에 넣어 않았다 링크의 허용 대답은, 그러나 ... (당신의 담당자 본) 이런 일에 익숙 할 일이 있기 때문에, 한 마디 말을하지 않는 사용에 대한을 모두 nohup을 하고 '&'... 난 확신 내 질문에 명확 충분히 다른 다른만큼, 두 개의 큰 응답이 여기에 있음을 증명하는 것; ) 또한 당신은 내가 다른 질문에 연결하기 위해 고통을 겪었다는 것을 암시하고 있습니까?
Cedric Martin

답변:


32

우선, 명령을 실행할 때마다 셸은 실행 여부에 관계없이 새 프로세스를 분기합니다 &. &백그라운드에서 실행 중임을 의미합니다.

이것은 매우 정확하지 않습니다. cd쉘 기능과 같은 일부 명령 은 일반적으로 새 프로세스를 분기하지 않습니다. type cmd일반적으로 cmd외부 명령인지 쉘 기능 인지를 알려줍니다 . type typetype자체가 쉘 함수 라는 것을 알려줍니다 .

nohup다른 것입니다. 새 프로세스에 무시하도록 지시합니다 SIGHUP. 상위 쉘이 닫힐 때 커널이 보내는 신호입니다.

질문에 대답하려면 다음을 수행하십시오.

  1. run emacs & (기본적으로 별도의 X 창에서 실행되어야 함) .
  2. 상위 쉘에서을 실행하십시오 exit.

emacs백그라운드에서 실행 되더라도 창이 종료 된 것을 알 수 있습니다. 이것이 기본 동작이며 nohup정확하게 수정하는 데 사용됩니다.

백그라운드에서 작업을 실행하면 ( &또는 bg다른 쉘에도 다른 구문이있을 것입니다) 현대 시스템의 기능에서 멀티 태스킹에 이르는 쉘 기능입니다. 대신 당신이 발사하려는 모든 프로그램, 현대 쉘에 대한 새로운 쉘 인스턴스를 분기의 ( bash, zsh, ksh, ...) 프로그램 (또는 목록을 관리 할 수있을 것이다 작업 ). 한 번에 하나만 포 그라운드에 있을 수 있습니다 . 즉, 쉘 포커스를 얻습니다. 누군가 전경에서 실행되는 프로세스와 백그라운드에서 실행되는 프로세스 (주요 프로세스는 stdin/ 에 필요함 stdout) 의 차이점을 더 확장 할 수 있기를 바랍니다 .

어쨌든 이것은 자식 프로세스가 반응하는 방식에 영향을 미치지 않습니다 SIGHUP. nohup그렇습니다.


훌륭한 답변을 위해 두 사람 모두에게 +1 ...하지만 여전히 혼란 스럽습니다 ... 나는 내 질문에 대답하기 전에 시도했습니다 : 아마도 내 (매우 오래된) 데비안 리눅스 설정이 올바르게 구성되지 않았지만 "emacs & "를 입력 한 다음"exit "를 입력하면 내 xterm 만 종료됩니다. emacs는 그대로 유지됩니다.
Cedric Martin

이맥스는 SIGHUP 자체를 처리 할 수있을 정도로 복잡합니다. 프로세스는 SIGHUP에서 기본적으로 종료됩니다. ntpd 또는 inetd와 같은 많은 '데몬'프로그램은 종료 대신 SIGHUP에서 구성을 다시 읽습니다. 나는 독창적 인 사람이므로 이맥스에 대한 경험이별로 없습니다.
Bruce Ediger

3
이맥스에는 특별한 것이 없습니다. 쉘은 일반적으로 쉘이 정상적으로 종료 될 때가 아니라 쉘이 SIGHUP수신 할 때 자식 프로세스로 보냅니다 SIGHUP. bash에는 종료시 자식 huponexit에게 보내도록 하는 옵션 이 SIGHUP있지만 기본적으로 활성화되어 있지 않습니다. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

안녕하세요. 우선, 좋은 설명입니다. 프로세스를 실행하여 논문을 확인하고을 실행하여 &쉘을 닫았습니다 exit. 프로세스가 여전히 실행 중입니다. 왜 죽지 않았는 지에 대한 아이디어가 있습니까? 아니면 여기에 뭔가 빠졌습니까?
Ali Yılmaz

실행중인 프로세스는 무엇입니까?
rahmu

16

하는 것이 유용한가요 nohup ... &? 예. 로 "백그라운드에서"프로세스를 시작하면 &새 프로세스는 여전히 원래 쉘의 "프로세스 그룹"에 멤버십이 있습니다. 해당 쉘 또는 프로세스 그룹이 특정 신호 (예 : SIGHUP)를 받으면 기본적으로 종료됩니다. 즉 &, xterm 또는 rxvt 또는 다른 윈도우 터미널 에뮬레이터로 시작한 쉘에서 프로세스를 실행 하면 창을 닫을 때 백그라운드 프로세스가 SIGHUP을 얻습니다. 일반적으로 작성된 코드는 SIGHUP을 처리하지 않으므로 종료됩니다.

그렇게 nohup ... &하면 nohup명령이 SIGHUP을 무시하도록 설정 한 다음 명령을 실행합니다. 새로 실행 된 명령 nohup은 명령 자체에서 신호 처리를하지 않는 한 설정 한 신호 마스크를 유지합니다 . xterm 또는 rxvt 등을 닫으면 커널은 SIGHUP을 명령 프로세스로 전달합니다.이 과정은 무시됩니다. 계속 작동합니다.

nohup명령을 수행하면 xterm을 닫거나 로그 오프 한 후에도 명령을 계속 실행할 수 있습니다.


미안-넌 날 잃었 어 &with nohup를 사용 nohup하면 사용 하지 않는 특정 인스턴스에서 명령 이 계속 실행 된다고 말하는가 ? 여기에 대한 답변과 충돌하는 것 같습니다 : unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB- "&"는 명령을 "백그라운드"로두기 위해 일반적인 포크 / 설정 사물 / 실행 시스템 호출을 수행합니다. 즉, nohupped되는 명령이 비동기 적으로 실행됩니다. 는 nohup전과 몇 가지 일을 exec()갈래 프로세스가 특정 신호를 무시하기 위해 시스템 호출. 예, "&"는 특정 상황에서 평범 nohup하지 않은 명령을 실행할 수있게합니다 . nohup을 수행 한 쉘과 연관된 xterm을 닫거나 로그 오프하는 것과 같습니다.
Bruce Ediger

-1

리눅스 운영 체제에서 백그라운드로 (& 접미사로) 프로그램을 실행하고 그 후에도 계속 로그 아웃하면 다음과 같이 실행하십시오.

  ping google.com > ping_result  &

다시 로그인 한 후 ping_result계속 증가 하는 출력 파일의 줄 수를 확인하면 여전히 실행 중이지만 닫힐 것이라는 메시지가 표시됩니다. 그런 다음 nohupcommand 사용은 무엇입니까 ?

nohup emac &->에 대해 위에서 언급 한 것처럼 emac시스템 로그 아웃 후에도 계속 실행되지만 다시 로그인 한 후에는 실행되지 않는 다른 시나리오 ==> .

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