태그 보관물: job-control

job-control

nohup, disown 및 &의 차이점 차이점은 무엇입니까 $ nohup foo 과 $ foo & 과 $ foo

차이점은 무엇입니까

$ nohup foo

$ foo &

$ foo & 
$ disown


답변

먼저 프로그램을 대화식 쉘 (터미널에 연결됨)에서 시작 &하거나 리디렉션없이 시작하면 어떻게되는지 살펴 보겠습니다 . 방금 입력했다고 가정 해 봅시다 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입니다. 그것은 작업 제어와 완전히 독립적이며 원칙적으로 전경 작업에도 사용될 수 있습니다 (매우 유용하지는 않지만).

답변

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


답변

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

&

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

내가 soffice를의 로그 / 눌러 CtrlCsoffice를 멈추고

nohup .. &

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

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

& disown

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

내가 soffice를의 로그 / 눌러 CtrlCsoffice를 멈추고

setsid .. &

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

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

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


답변