유닉스 기반 시스템에 서비스를 배포 할 때 sysadmin 관점과 실질적인 차이점은 무엇입니까?
유닉스 기반 시스템에 서비스를 배포 할 때 sysadmin 관점과 실질적인 차이점은 무엇입니까?
답변:
일반적인 데몬 제거 방법은 다음과 같습니다.
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
이를 통해 프로세스가 더 이상 터미널과 동일한 프로세스 그룹에 있지 않으므로 프로세스와 함께 종료되지 않습니다. IO 리디렉션은 터미널에 출력이 나타나지 않도록하는 것입니다.
&
답변에 부품 설명을 추가하십시오 . 원래 질문을 확인하면 불완전한 것 같습니다.
데몬의 경우 원하는 것은 아무것도없는 프로세스입니다. 최소한, 자신의 세션에 있고, 터미널에 연결되지 않고, 부모로부터 상속받은 파일 디스크립터가 있거나, 어떤 것도 열려 있지 않으며, 부모를 돌보는 부모가 없습니다 (init 이외의) /
umount를 방지하기 위해 디렉토리에 ...
터미널에서 분리하려면 새 세션을 작성하지만 세션을 작성하려면 그룹 (또는 세션) 리더가 아니어야하므로 새 프로세스를 분기하는 것이 가장 좋습니다. 부모가 종료한다고 가정하면 프로세스에 더 이상 부모가 없으며 init에 의해 채택됩니다. 그런 다음 가능한 모든 파일 디스크립터를 닫으 십시오. 파일 디스크립터와 같은 해당 자원을 해제하기 위해 현재 작업 디렉토리를 닫을chdir("/")
수 없으며 , 현재 작업 디렉토리가 디렉토리 마운트 해제를 방해하지는 않습니다./
이 프로세스는 세션 리더이므로 터미널 장치를 열면 해당 터미널의 제어 프로세스가 될 위험이 있습니다. 두 번째로 포크하면 발생하지 않습니다.
반면에 &는 대화식 쉘에서 터미널의 포 그라운드 프로세스 그룹에 있지 않도록 새 프로세스 그룹을 포크하고 작성하고 비 대화식 쉘에서는 프로세스를 포크하고 SIGINT를 무시합니다. 터미널에서 분리되지 않고 파일 설명자를 닫지 않습니다 (일부 쉘은 stdin을 다시 열지 만 /dev/null
) ...
프로그램 / 프로세스를 데몬으로 실행하는 것과 앰퍼샌드를 사용하여 백그라운드로 분기하는 것의 차이점은 기본적으로 소유권과 관련이 있습니다.
대부분의 경우, 데몬의 상위 프로세스는 init 프로세스 (유닉스 시스템에서 가장 먼저 시작되는 프로세스)이며 해당 프로세스의 하위 프로세스 인 데몬은 권한이없는 사용자로 직접 제어 할 수 없음을 의미합니다. . 반면에 프로그램 / 프로세스를 백그라운드로 포크하면 언제든지 포 그라운드로 다시 호출하거나 죽일 수 있습니다.
함께 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
되지만이 파일 이름은 옵션으로 변경할 수 있습니다.
command &
나중에 쉘에서 분리 disown
하여 포스트 노후 (post-nohup)로 작동 할 수 있습니다 .