분기에 "&"를 사용한 경우 언제 "nohup"이 필요합니까?

분기에 "&"를 사용한 경우 언제 "nohup"이 필요합니까?

첫째, 이 질문은 관련이 있지만 다음과 같은 매우 좋은 질문과는 확실히 다릅니다.

nohup, disown, &의 차이점

한 가지 이해하고 싶은 것이 있습니다. "&"를 할 때 포크를 한다는 것입니다. 그렇죠?

"nohup ... &" 작업이 작동합니까, 아니면 간단하고 충분합니까?

"&"를 사용하고 있지만 여전히 "nohup"을 사용하고 싶은 상황을 누군가 보여줄 수 있나요?

답변1

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

이는 그다지 정확하지 않으니 참고하시기 바랍니다. 쉘 기능 과 같은 일부 명령은 cd일반적으로 새 프로세스를 생성하지 않습니다. 이는 일반적 으로 외부 명령인지 쉘 기능인지 type cmd알려줍니다 . 쉘 함수 자체임을 알려드립니다 .cmdtype typetype

nohup뭔가 다른 것 같아요. 새로운 프로세스에게 무시하라고 지시합니다 SIGHUP. 상위 쉘이 닫힐 때 커널이 보내는 신호입니다.

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

  1. 달리기emacs & (기본적으로 별도의 X 창에서 실행해야 함).
  2. 상위 셸에서 를 실행합니다 exit.

emacs창이 백그라운드에서 실행 중이지만 종료되었음을 알 수 있습니다 . 이는 기본 동작이므로 nohup이를 수정하는 데 사용하세요.

백그라운드에서 작업을 실행하는 것( &또는 사용 bg, 다른 쉘에는 다른 구문이 있을 것임)은 현대 시스템의 멀티태스킹 기능에서 비롯된 쉘의 기능입니다. 최신 쉘( bash, zsh, ksh, ...)은 프로그램 목록(또는일하다). 한 번에 한 사람만 있을 수 있습니다.전망, 이는 쉘 포커스를 얻는다는 것을 의미합니다. 나는 누군가가 포그라운드에서 실행되는 프로세스와 백그라운드에서 실행되는 프로세스(주로 stdin/에 액세스 stdout) 사이의 차이점에 대해 더 많은 정보를 제공할 수 있기를 바랍니다.

어떤 경우에도 이는 하위 프로세스 쌍이 반응하는 방식에 영향을 미치지 않습니다 SIGHUP. nohup하다.

답변2

이것이 유용합니까 nohup ... &? 예. In Background 를 사용하여 프로세스를 시작한 경우 &새 프로세스는 여전히 원래 셸의 프로세스 그룹에 속해 있습니다. 쉘 또는 프로세스 그룹이 특정 신호(예: SIGHUP)를 수신하면 기본적으로 종료됩니다. 이는 &xterm, rxvt 또는 기타 창 터미널 에뮬레이터에 의해 시작된 셸에서 프로세스를 실행하는 경우 창을 닫을 때 백그라운드 프로세스가 SIGHUP을 수신한다는 의미입니다. 대부분의 무작위로 작성된 코드는 SIGHUP을 처리하지 않으므로 종료됩니다.

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

명령에 대해 수행하면 nohupxterm을 닫거나 로그아웃한 후에도 명령이 계속 실행됩니다.

답변3

여기서 언급되지 않은 한 가지는 "터미널 종료 시 HUP 보내기" 이벤트가 구성 가능하다는 것입니다. 이는 발생할 수도 있고 발생하지 않을 수도 있습니다. 이는 nohup작업 수행 방법에 대한 일부 사람들의 인식을 혼란스럽게 할 수 있습니다. 터미널 종료 시 HUP 전송이 비활성화된 경우 nohup원치 않는 결론을 도출하게 됩니다. 터미널 종료 시 HUP를 보내는 것은 bash의 셸 옵션입니다.

노력하다

shopt | grep huponexit

터미널이 종료될 때 HUP가 전송되는지 여부를 알려줍니다. 그렇다면 nohup을 사용해야 합니다. 그렇지 않다면 그렇지 않을 것입니다.

답변4

Linux 운영 체제(접미사에 &가 붙음)에서 백그라운드로 실행 중인 프로그램이 있고 로그아웃한 후에도 계속 실행되는 경우: 다음을 사용해 보십시오.

  ping google.com > ping_result  &

다시 로그인한 후에는 확인 출력 파일의 행 수가 ping_result계속해서 증가합니다. 즉, 해당 파일은 계속 실행 중이지만 종료될 것이라는 메시지가 표시됩니다. 그렇다면 명령의 용도는 무엇입니까 nohup?

또 다른 경우 ==> 위에서 언급했듯이 nohup emac &--> emac시스템 로그아웃 후에도 계속 실행되어야 하지만, 다시 로그인한 후에는 표시되지 않습니다.

관련 정보