it-swarm-ko.tech

Nohup, disown 및 &의 차이점

차이점은 무엇입니까

$ Nohup foo

$ foo &

$ foo & 
$ disown
600
lesmana

먼저 &없이 (및 리디렉션없이) 대화식 셸 (터미널에 연결됨)에서 프로그램을 시작하면 어떻게되는지 살펴 보겠습니다. foo을 입력했다고 가정 해 봅시다.

  • foo을 실행하는 프로세스가 생성됩니다.
  • 프로세스는 쉘에서 stdin, stdout 및 stderr를 상속합니다. 따라서 동일한 터미널에도 연결됩니다.
  • 셸이 SIGHUP을 받으면 SIGHUP도 프로세스로 보냅니다 (일반적으로 프로세스가 종료됩니다).
  • 그렇지 않으면 프로세스가 종료 될 때까지 셸이 대기합니다 (차단됨).

이제 프로세스를 백그라운드에두면 foo &를 입력하면 어떻게되는지 살펴 보겠습니다.

  • foo을 실행하는 프로세스가 생성됩니다.
  • 프로세스는 셸에서 stdout/stderr를 상속하므로 여전히 터미널에 씁니다.
  • 이 프로세스는 원칙적으로 stdin을 상속 받지만 stdin에서 읽으려고하면 중지됩니다.
  • 셸이 관리하는 백그라운드 작업 목록에 포함되며 특히 다음을 의미합니다.
    • jobs과 함께 나열되며 %n를 사용하여 액세스 할 수 있습니다 (여기서 n은 작업 번호 임).
    • fg을 사용하여 포 그라운드 작업으로 전환 할 수 있습니다.이 경우 &를 사용하지 않은 것처럼 계속됩니다 (표준 입력에서 읽으려고 시도하여 중지 된 경우). 이제 터미널에서 읽을 수 있습니다).
    • 셸이 SIGHUP을 받으면 SIGHUP도 프로세스에 보냅니다. 셸 및 셸에 대해 설정된 옵션에 따라 셸을 종료 할 때 프로세스에 SIGHUP도 전송됩니다.

이제 disown은 Shell의 작업 목록에서 작업을 제거하므로 위의 모든 하위 지점은 더 이상 적용되지 않습니다 (Shell에서 SIGHUP을 보내는 프로세스 포함). 그러나 still 은 터미널에 연결되어 있으므로 터미널이 파괴 된 경우 (xterm 또는 ssh이고 제어 프로그램은 xterm을 닫거나 SSH 연결) 프로그램을 종료하여 종료됩니다. 표준 입력에서 읽거나 표준 출력에 쓰려고하면 즉시 실패합니다.

반면 Nohup은 프로세스를 터미널에서 효과적으로 분리하는 것입니다.

  • 표준 입력을 닫습니다 (프로그램은 not 입력이 포 그라운드에서 실행 되더라도 입력을 읽을 수 없습니다. 정지되지는 않지만 정지됩니다. 오류 코드를 받거나 EOF).
  • 표준 출력 및 표준 오류를 파일 Nohup.out로 리디렉션하므로 터미널이 실패하더라도 프로그램이 표준 출력에 쓰지 못하므로 프로세스 쓰기에 관계없이 손실되지 않습니다.
  • 프로세스가 SIGHUP (따라서 이름)을 수신하지 못하게합니다.

Nohup not 쉘의 작업 제어에서 프로세스를 제거하고 백그라운드에서 프로세스를 제거하지 않습니다. 포 그라운드 Nohup 작업은 다소 쓸모가 없습니다. 일반적으로 &를 사용하여 백그라운드에 넣습니다. 예를 들어 disown과 달리 셸은 Nohup 작업이 완료된 시점을 알려줍니다 (물론 이전에 셸이 종료되지 않는 한).

요약하면 다음과 같습니다.

  • &는 백그라운드에서 작업을 수행합니다. 즉, 입력 읽기를 차단하고 셸이 완료 될 때까지 기다리지 않습니다.
  • disown은 셸의 작업 제어에서 프로세스를 제거하지만 여전히 터미널에 연결되어 있습니다. 결과 중 하나는 Shell이 ​​SIGHUP을 보내지 않는다는 것입니다. 전경 작업이 실행 중일 때는 입력 할 수 없으므로 백그라운드 작업에만 적용 할 수 있습니다.
  • Nohup은 터미널에서 프로세스의 연결을 끊고 출력을 Nohup.out로 리디렉션하고 SIGHUP에서 보호합니다. 효과 중 하나 (이름 지정)는 프로세스가 전송 된 SIGHUP을받지 못한다는 것입니다. 그것은 작업 제어와 완전히 독립적이며 원칙적으로 전경 작업에도 사용될 수 있습니다 (매우 유용하지는 않지만).
595
celtschk

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

174
Michael Mrozek

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

&

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

I 참조 soffice logs/Ctrl-C 사무실 중지

노 h .. &

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

I 보이지 않음 soffice logsCtrl-C 사무실 중지

& disown

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

I 참조 soffice logs/Ctrl-C 사무실 중지

setsid .. &

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

I 참조 soffice logs /를 눌러 Ctrl-C 사무실 중지하지 않음

공간을 절약하려면
Nohup setsid .. : 로그/soffice를 표시하지 않습니다 정지하지 마십시오 Ctrl-C
Nohup with & disown 끝에 : 로그를 표시하지 않음/사무실이 멈춤 Ctrl-C

9
Marinos An