둘 사이의 차이점은 무엇입니까
$ nohup foo
그리고
$ foo &
그리고
$ foo &
$ disown
답변1
먼저 리디렉션 없이(및 리디렉션 없이) 대화형 셸(터미널에 연결된)에서 프로그램을 시작하면 &
어떤 일이 발생하는지 살펴보겠습니다. 방금 입력했다고 가정해 보겠습니다 foo
.
- 실행 중인 프로세스가
foo
생성되었습니다. - 프로세스는 쉘에서 stdin, stdout 및 stderr을 상속합니다. 그래서 같은 터미널에도 연결되어 있습니다.
- 쉘이 을 수신하면 프로세스에도 을 보냅니다(이로 인해 일반적으로 프로세스가 종료됩니다)
SIGHUP
.SIGHUP
- 그렇지 않으면 쉘은 프로세스가 종료되거나 중지될 때까지 대기(차단)합니다.
이제 프로세스를 백그라운드에 두면 어떤 일이 발생하는지 살펴보겠습니다. 즉, 다음을 입력하세요 foo &
.
- 실행 중인 프로세스가
foo
생성되었습니다. - 프로세스는 쉘에서 stdout/stderr을 상속합니다(그래서 여전히 터미널에 씁니다).
- 원칙적으로 프로세스는 stdin도 상속하지만 stdin에서 읽으려고 시도하자마자 중지됩니다.
- 이는 셸에서 관리하는 백그라운드 작업 목록에 포함됩니다. 이는 특히 다음을 의미합니다.
- 이는 나열되어 있으며 (작업 번호는 어디에 있습니까?)를 사용하여 액세스
jobs
할 수 있습니다 .%n
n
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를 사용하여 강제로 실제 데몬으로 실행되도록 할 수 있습니다.
&
// 모든 혼란스러운 부분을 대체합니다 .nohup
disown