nohup, disown 및 &의 차이점


579

차이점은 무엇입니까

$ nohup foo

$ foo &

$ foo & 
$ disown

50
잠깐, PID를 지정하지 않고 해제 할 수 있습니까? 큰!
ripper234

34
또한이 foo &!처음부터 그것을 부인하는 동일해야한다.
user4514

26
배쉬는 &!를 지원하지 않습니다.
Jonas Kongslund 4

20
foo & disown즉시 제거합니다.
ctrl-alt-delor

9
나는의 언급을보고 싶어요 setsid, 그리고 어떻게 관련 disownnohup
YoungFrog

답변:


558

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

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

이제 프로세스를 백그라운드에 넣는 경우, 즉 다음을 입력하면 어떻게되는지 봅시다 foo &.

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

이제 disown쉘의 작업 목록에서 작업을 제거하므로 위의 모든 하위 지점은 더 이상 적용되지 않습니다 ( SIGHUP쉘 이 보낸 프로세스 포함 ). 그러나 터미널에 여전히 연결되어 있으므로 터미널이 파괴 된 경우 ( xterm또는 ssh에 의해 생성 된 것과 같은 pty이고 제어 프로그램이 종료되면 xterm을 닫거나 SSH 연결을 종료하여 발생할 수 있음 ) 표준 입력에서 읽거나 표준 출력에 쓰려고하면 프로그램이 실패합니다.

무엇 nohup합니까, 다른 한편으로는, 효과적으로 터미널에서 프로세스를 분리하는 것입니다 :

  • 그것은 표준 입력 (프로그램이됩니다 종료 되지 는 중단되지 않습니다.이 포 그라운드에서 실행되는 경우에도, 모든 입력을 읽을 수 있지만 오류 코드 또는를 받게됩니다 EOF).
  • 표준 출력 및 표준 오류를 파일로 리디렉션 nohup.out하므로 터미널이 실패하더라도 프로그램이 표준 출력에 쓰지 못하므로 프로세스 쓰기가 손실되지 않습니다.
  • 프로세스가 SIGHUP(따라서 이름을) 받지 못하게합니다 .

참고 nohup않습니다 되지 도 쉘의 작업 제어에서 프로세스를 제거하고 배경에 넣어하지 않습니다 (그러나 전경 때문에 nohup작업이 더 많거나 적은 쓸모없는, 당신은 일반적으로 사용 배경에 넣어 것 &). 예를 들어,와 달리 disown, 쉘은 nohup 작업이 완료된 시점을 알려줍니다 (물론 이전에 쉘이 종료되지 않는 한).

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

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

8
+1 감사합니다. disown, nohup 및 &를 함께 사용하면 어떻게됩니까?
Tim

15
세 가지를 모두 함께 사용하면 프로세스가 백그라운드에서 실행 중이고 쉘의 작업 제어에서 제거되며 터미널에서 효과적으로 연결이 끊어집니다.
celtschk


1
차이 무엇 disown %1disown -h %1? 두 번째는 터미널이 종료 될 때까지 정규 작업으로 유지하지만 HUP 신호를 무시합니까?
schemacs

4
아마도 (foo&)subshell을 포함 할 가치가 있습니다
jiggunjer

169

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


10
nohup과 disown의 사소한 차이 : disown 명령은 작업 목록에서 제거합니다. nohup 은하 지 않습니다.
Shawn J. Goff

191
nohup그리고 disown둘 다 SIGHUP다른 방법으로 억제한다고 말할 수 있습니다 . nohup프로그램이 신호를 처음에 무시하도록합니다 (프로그램이이를 변경할 수 있음). nohup또한 SIGHUP터미널을 닫을 때 커널 이 전송하지 않도록 제어 터미널이없는 프로그램을 프로그램에 배치하려고 시도합니다 . disown순전히 껍질의 내부; 쉘 SIGHUP이 종료 될 때 쉘이 전송되지 않게합니다 .
Gilles

27
@ Giles, 귀하의 의견은 그 자체로 답변 할 가치가 있습니다.
lesmana

5
disown작업 목록에서 작업 을 제거하는 것과 관련된 @ ShawnJ.Goff의 의견에 대한 설명입니다 . 옵션을 지정하지 않으면 작업 목록에서 옵션이 제거됩니다. 그러나-h 옵션 을 지정하면 각 작업 스펙이 테이블에서 제거 되지 않습니다 . 대신, SIGHUP쉘이을 수신하면 작업으로 전송되지 않도록합니다 SIGHUP.
tacotuesday

4
그냥 사용하여 명확하게 &그것을 분리, 당신에게 터미널을 제공하지 않습니다 stdin과정에서 백그라운드에서 실행되도록 원인이 있지만, 모두 stdoutstderr여전히 현재 청각 장애에 연결되어 있습니다. 이것은 다른 프로그램의 텍스트를 함께 섞을 수 있음을 의미하며, gimp &다른 tty를 사용하려고 시도하는 동안 많은 GTK + 오류가 발생 하면 상당히 성 가실 수 있습니다 .
Frank

8

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

&

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

내가 soffice를의 로그 / 눌러 Ctrl- Csoffice를 멈추고

nohup .. &

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

나는 보이지 않는 soffice를의 로그 / 눌러 Ctrl- Csoffice를 멈추고

& disown

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

내가 soffice를의 로그 / 눌러 Ctrl- Csoffice를 멈추고

setsid .. &

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

내가 soffice를의 로그가 / 눌러 Ctrl- Csoffice를이 멈추지 않는다

공간을 절약하려면
nohup setsid ..: 로그를 표시하지 않습니다 / soffice를가 에 멈추지 않는다 Ctrl-C
nohup& disown말 : 로그를 표시하지 않습니다 / soffice를이에 중지 Ctrl-C


2
setsid를 언급하고 특정 상황에서 어떤 일이 일어나는지 보여 주려는 노력에 감사하지만 더 철저한 답변을 원합니다. 특히, 각 솔루션의 차이점과 유사점은 가시적 (쉘 또는 터미널을 닫을 때 발생하는 결과, 출력은 어디로 가는가 ...)과 보이지 않는 것 (후드에서 작업이 수행되는 방식 및 그 의미)입니다. 허용되는 답변은 그에 대한 좋은 기반입니다.
YoungFrog

1
@YoungFrog 나는 이것에 동의합니다!
Marinos An

나를 nohup ⟨command⟩ & disown위해 만든 프로세스로 멈추지 않습니다 Ctrl+C.
k.stm

@ k.stm 시도 했습니까 soffice? soffice명령이 다른 것으로 보입니다. 그래서 여기에 규칙 예외로 추가하는 것을 고려했습니다. 예를 들어 :을 사용할 때 정상적으로 nohup .. &누르면 Ctrl-c명령이 중지되지 않지만 명령이 중지 soffice됩니다. 나는 누군가가 이것을 밟을 때까지 기다렸다가 왜 이것이 soffice에서 일어나는지 설명합니다. :)
Marinos An

@MarinosAn 네, 했어요. 나는 실행 nohup soffice &및 프레스 Ctrl+C. 예상대로 아무 일도 일어나지 않았습니다.
k.stm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.