프로그램을 데몬으로 실행하고 '&'를 사용하여 백그라운드로 포크하는 것의 차이점은 무엇입니까?


답변:


31

일반적인 데몬 제거 방법은 다음과 같습니다.

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

이를 통해 프로세스가 더 이상 터미널과 동일한 프로세스 그룹에 있지 않으므로 프로세스와 함께 종료되지 않습니다. IO 리디렉션은 터미널에 출력이 나타나지 않도록하는 것입니다.


5
백그라운드 프로세스 (&)를 생성하는 터미널이 닫히면 백그라운드 프로세스도 종료됩니까?
user1561108

9
터미널이 종료되면 프로세스는 SIGHUP을 수신하며, 해당 신호의 기본 핸들러는 프로세스를 종료하는 것입니다.
Dennis Kaarsemaker

12
&답변에 부품 설명을 추가하십시오 . 원래 질문을 확인하면 불완전한 것 같습니다.
mtk

1
이는 백그라운드에서 작업을 실행하고 프로세스가 특별한 작업을 수행하지 않기 때문입니다.)
Dennis Kaarsemaker

33

데몬의 경우 원하는 것은 아무것도없는 프로세스입니다. 최소한, 자신의 세션에 있고, 터미널에 연결되지 않고, 부모로부터 상속받은 파일 디스크립터가 있거나, 어떤 것도 열려 있지 않으며, 부모를 돌보는 부모가 없습니다 (init 이외의) /umount를 방지하기 위해 디렉토리에 ...

터미널에서 분리하려면 새 세션을 작성하지만 세션을 작성하려면 그룹 (또는 세션) 리더가 아니어야하므로 새 프로세스를 분기하는 것이 가장 좋습니다. 부모가 종료한다고 가정하면 프로세스에 더 이상 부모가 없으며 init에 의해 채택됩니다. 그런 다음 가능한 모든 파일 디스크립터를 닫으 십시오. 파일 디스크립터와 같은 해당 자원을 해제하기 위해 현재 작업 디렉토리를 닫을chdir("/") 수 없으며 , 현재 작업 디렉토리가 디렉토리 마운트 해제를 방해하지는 않습니다./

이 프로세스는 세션 리더이므로 터미널 장치를 열면 해당 터미널의 제어 프로세스가 될 위험이 있습니다. 두 번째로 포크하면 발생하지 않습니다.

반면에 &는 대화식 쉘에서 터미널의 포 그라운드 프로세스 그룹에 있지 않도록 새 프로세스 그룹을 포크하고 작성하고 비 대화식 쉘에서는 프로세스를 포크하고 SIGINT를 무시합니다. 터미널에서 분리되지 않고 파일 설명자를 닫지 않습니다 (일부 쉘은 stdin을 다시 열지 만 /dev/null) ...


chdir ( "/")의 용도는 무엇입니까? 파일 디스크립터를 닫으려면?
Timothy Leung

@TimothyLeung, 편집 참조.
Stéphane Chazelas

8

프로그램 / 프로세스를 데몬으로 실행하는 것과 앰퍼샌드를 사용하여 백그라운드로 분기하는 것의 차이점은 기본적으로 소유권과 관련이 있습니다.

대부분의 경우, 데몬의 상위 프로세스는 init 프로세스 (유닉스 시스템에서 가장 먼저 시작되는 프로세스)이며 해당 프로세스의 하위 프로세스 인 데몬은 권한이없는 사용자로 직접 제어 할 수 없음을 의미합니다. . 반면에 프로그램 / 프로세스를 백그라운드로 포크하면 언제든지 포 그라운드로 다시 호출하거나 죽일 수 있습니다.


1
또한 프로세스를 분리하여 터미널의 자식으로 유지하는 위의 기술적 측면에 대답하기 위해 "nohup firefox &"
Odaym

7

함께 command &귀하의 프로세스가 SIGHUP 신호에 의해 살해 될 것 부모가 죽었을 때.

그러나 Sysadmin은 일부 해결 방법에 액세스 할 수 있습니다.

bash 시스템에서는 다음을 사용할 수 있습니다.

(trap '' HUP; command) &

서브 쉘을 열고 HUP빈 핸들러로 신호를 트랩 하고 앰퍼샌드 / 포크합니다.

출력이 여전히 잘못된 것으로 리디렉션 될 수 있습니다 tty. 아니면 길을 잃을 수도 있습니다.
당신이 고칠 수와 &>command.out, 1>output.out또는2>errors.out

대부분의 시스템에서 nohup명령 에 액세스 할 수도 있습니다 .
nohup이 과정을 크게 단순화합니다. 꽤 표준 적이지만 많은 busybox 임베디드 ARM 배포판이 누락 된 것을 발견했습니다. 당신은 단지 작성 :

nohup command &

.. 그리고 당신은 끝났습니다. 출력이 IIRC로로 리디렉션 nohup.out되지만이 파일 이름은 옵션으로 변경할 수 있습니다.


2
ZSH를 사용하면 command &나중에 쉘에서 분리 disown하여 포스트 노후 (post-nohup)로 작동 할 수 있습니다 .
math
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.