nohup, disown, &의 차이점

nohup, disown, &의 차이점

둘 사이의 차이점은 무엇입니까

$ nohup foo

그리고

$ foo &

그리고

$ foo & 
$ disown

답변1

먼저 리디렉션 없이(및 리디렉션 없이) 대화형 셸(터미널에 연결된)에서 프로그램을 시작하면 &어떤 일이 발생하는지 살펴보겠습니다. 방금 입력했다고 가정해 보겠습니다 foo.

  • 실행 중인 프로세스가 foo생성되었습니다.
  • 프로세스는 쉘에서 stdin, stdout 및 stderr을 상속합니다. 그래서 같은 터미널에도 연결되어 있습니다.
  • 쉘이 을 수신하면 프로세스에도 을 보냅니다(이로 인해 일반적으로 프로세스가 종료됩니다) SIGHUP.SIGHUP
  • 그렇지 않으면 쉘은 프로세스가 종료되거나 중지될 때까지 대기(차단)합니다.

이제 프로세스를 백그라운드에 두면 어떤 일이 발생하는지 살펴보겠습니다. 즉, 다음을 입력하세요 foo &.

  • 실행 중인 프로세스가 foo생성되었습니다.
  • 프로세스는 쉘에서 stdout/stderr을 상속합니다(그래서 여전히 터미널에 씁니다).
  • 원칙적으로 프로세스는 stdin도 상속하지만 stdin에서 읽으려고 시도하자마자 중지됩니다.
  • 이는 셸에서 관리하는 백그라운드 작업 목록에 포함됩니다. 이는 특히 다음을 의미합니다.
    • 이는 나열되어 있으며 (작업 번호는 어디에 있습니까?)를 사용하여 액세스 jobs할 수 있습니다 .%nn
    • fg를 사용하여 포그라운드 작업 으로 변환할 수 있습니다 &.
    • 쉘이 하나를 받으면 프로세스에도 하나를 보냅니다 SIGHUP. SIGHUP쉘과 쉘에 대해 설정할 수 있는 옵션에 따라 쉘이 종료되면 SIGHUP프로세스에도 를 보냅니다.

이제 작업이 disown셸의 작업 목록에서 제거되었으므로 위의 모든 하위 항목이 더 이상 적용되지 않습니다( SIGHUP셸에서 보낸 프로세스 포함). 하지만 참고해주세요아직터미널에 연결하여 터미널이 파괴되고( xterm또는 에 의해 생성된 pty 와 같은 pty인 경우 발생할 수 있음 ssh) xterm을 닫거나 제어 프로그램이 종료되는 경우SSH연결), 프로그램은 표준 입력에서 읽거나 표준 출력에 쓰려고 시도하자마자 실패합니다.

반면에 nohup프로세스를 터미널에서 효과적으로 분리하십시오.

  • 표준 입력을 닫습니다(프로그램은아니요포그라운드에서 실행 중인 경우에도 모든 입력을 읽을 수 있습니다. 멈추지는 않지만 오류 코드 또는 EOF)가 표시됩니다.
  • 표준 출력 및 표준 오류를 파일로 리디렉션하므로 nohup.out터미널이 실패하더라도 표준 출력에 기록하여 프로그램이 실패하지 않으므로 프로세스에서 작성한 모든 내용이 손실되지 않습니다.
  • 이는 프로세스가 SIGHUP(따라서 이름)을 수신하는 것을 방지합니다.

nohup실제로도 그러하니 참고하세요아니요쉘의 작업 제어에서 프로세스를 제거하고 백그라운드에도 넣습니다(그러나 포그라운드 nohup작업은 다소 쓸모가 없으므로 일반적으로 백그라운드에 넣는 것을 사용합니다 &). 예를 들어 와 달리 disown셸은 nohup 작업이 완료되면 알려줍니다(물론 셸이 이전에 종료되지 않은 경우는 제외).

결론적으로:

  • &작업을 백그라운드에 둡니다. 즉, 입력 읽기를 시도하는 동안 작업을 차단하고 셸이 작업이 완료될 때까지 기다리지 않도록 합니다.
  • disown쉘의 작업 제어에서 프로세스를 제거하지만 터미널에는 계속 연결되어 있습니다. 한 가지 결과는 쉘이 그것을 보내지 않는다는 것입니다 SIGHUP. 백그라운드 작업이 실행되는 동안에는 입력할 수 없기 때문에 이는 백그라운드 작업에만 적용됩니다.
  • nohup터미널에서 프로세스의 연결을 끊고 출력을 터미널로 리디렉션한 nohup.out후 마스크합니다 SIGHUP. 효과 중 하나(명칭된 것)는 프로세스가 전송된 어떤 것도 수신하지 않는다는 것입니다 SIGHUP. 이것은 작업 제어와 완전히 독립적이며 원칙적으로 포그라운드 작업에도 사용될 수 있습니다(매우 유용하지는 않지만).

답변2

를 사용하면 &프로그램이 백그라운드에서 실행되므로 프로그램이 끝날 때까지 차단하는 대신 새 쉘 프롬프트가 표시됩니다. nohup그리고 disown기본적으로 관련이 없습니다. SIGHUP(hangup) 신호를 억제하므로 제어 터미널이 닫힐 때 프로그램이 자동으로 종료되지 않습니다. nohup작업을 처음 시작할 때 이 작업을 수행합니다. nohup작업이 시작될 때 시작하지 않은 경우 disown실행 중인 작업 수정을 사용할 수 있습니다. 인수 없이 방금 백그라운드에서 실행된 작업인 현재 작업이 수정됩니다.

답변3

이것은 종료되지 않는 명령(예: )에 따라 백그라운드에서 soffice를 실행하려고 시도한 경험입니다 tail. 이 예에서는 sleep 100.

아래의 모든 경우에는 다음과 같이 했습니다.

./scriptfile
<Ctl-C>

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

바라보다사무실통나무/ 에 따르면Ctrl-오피스 C스테이션

노스햅..&

#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

보지 못했어요사무실통나무/ 누르기 Ctrl- C사무실 중지

& 부인하다

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

바라보다사무실통나무/ 에 따르면Ctrl-오피스 C스테이션

서독 설정..&

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

바라보다사무실통나무/press Ctrl- C사무실논스톱

공간을 절약하려면: :
nohup setsid ..로그/사무실을 표시하지 않습니다.멈추지 않을 거야 Ctrl-C
nohup& disown: 로그를 표시하지 않음/사무실은 Ctrl- 에 멈춥니다.C

답변4

daemonize"실제 배경" 프로세스 실행과 관련된 모든 작업을 처리하는 (1) 유틸리티 도 참조하세요 . 해당 문서에 따르면:

daemonize는 Unix 데몬 프로세스로 명령을 실행합니다. W. Richard Stevens가 1990년 저서 Unix 네트워크 프로그래밍(Addison-Wesley, 1990)에서 정의한 대로 데몬은 "백그라운드에서(즉, 관련 터미널이나 로그인 셸 없이) 실행되는 프로세스입니다. 프로세스". 이벤트가 발생하거나 특정 작업이 주기적으로 수행되기를 기다립니다. "시작되면 일반적인 데몬은 다음을 수행합니다.

  • 열려 있는 모든 파일 설명자(특히 표준 입력, 표준 출력 및 표준 오류)를 닫습니다.
  • 작업 디렉터리를 루트 파일 시스템으로 변경하여 다른 파일 시스템을 차지하지 않고 마운트 해제되는 것을 방지하세요.
  • umask 값을 재설정하세요.
  • 백그라운드에서 실행(예: 포크)
  • 프로세스 그룹(일반적으로 셸)에서 연결을 해제하여 프로세스 그룹(예: HUP)으로 전송된 신호로부터 자신을 격리합니다.
  • 모든 터미널 I/O 신호를 무시합니다.
  • 제어 단말과의 연결을 끊습니다(그리고 제어 단말을 다시 획득하지 않도록 조치를 취합니다)
  • 모든 SIGCLD 신호 처리

데몬으로 실행되도록 설계된 대부분의 프로그램은 자체적으로 작동합니다. 그러나 때때로 이렇게 하지 않는 상황에 직면하게 될 것입니다. 실제 Unix 데몬으로 제대로 변환할 수 없는 데몬을 실행해야 하는 경우 daemonize를 사용하여 강제로 실제 데몬으로 실행되도록 할 수 있습니다.

&// 모든 혼란스러운 부분을 대체합니다 .nohupdisown

관련 정보