잘 행동하는 데몬 데몬 자체가 필요합니까? [폐쇄]

잘 행동하는 데몬 데몬 자체가 필요합니까? [폐쇄]

존재하다이 답변덧붙여서, init데몬이 이중 포크 및 종료 트릭을 사용하여 자신을 다시 부모로 지정하는 것은 부적절합니다. 답변은 더 이상 존재하지 않는 웹사이트로 연결됩니다.그런데 인터넷 아카이브에서 찾았어요. 여기에는 여러 가지 이유가 나열되어 있는데, 이는 "깨질 수 있거나 데몬화 init를 기대하지 않으므로 데몬화해서는 안 되며, 누군가가 대화형으로 실행하는 경우 백그라운드 실행을 사용하거나 &명시 nohup적으로 요청해야 합니다."로 요약됩니다. 적절하게 구성된 데몬은 제어를 받을 때 이미 일반 환경에서 실행되고 있어야 하기 때문에 상당히 설득력이 있는 것 같습니다. (이상적으로는 멋진 자동화 기능을 갖춘 컨테이너에서 실행되지만 이는 또 다른 이야기입니다.)

그런데 우리가 왜 이러는지 이해가 안 돼요.setsid(2)우리가 그것을 사용해서는 안 된다면. 내가 이해할 수setpgid(2);(현대적인) 쉘을 구현하려면 이것이 필요하지만 다음과 같습니다.오직이를 호출하는 신뢰할 수 있는 방법은 setsid(2)데몬을 사용하는 것입니다. 매뉴얼 페이지에서는 이를 수행하라고 지시합니다. 나는 이를 사용하여 결국 실행 login(1)되지만 권한 있는 시스템 호출은 아닌 다양한 저수준 도구를 구현하는 데 사용할 수 있다고 상상하며 setsid(2)해당 매뉴얼 페이지에는 이 사용 사례에 대한 언급이 없습니다. 적어도 파이썬 사람들은,데몬 프로세스에 상위 재설정이 포함되는 것 같습니다., 그리고 나는 이러한 태도를 다른 많은 맥락(특히 PEP에 인용된 교과서와 같은 학계)에서 보았습니다.

또 다른 참고사항으로,daemonize(1)그리고daemon(3)(일부 시스템에서는) 전자의 매뉴얼 페이지에 다음과 같이 나와 있습니다.

데몬으로 실행되도록 설계된 대부분의 프로그램은 스스로 [부모 재지정을 포함한 다양한 작업]을 수행합니다. 그러나 때때로 이렇게 하지 않는 상황에 직면하게 될 것입니다. 실제 Unix 데몬으로 제대로 변환할 수 없는 데몬을 실행해야 하는 경우 daemonize를 사용하여 강제로 실제 데몬으로 실행되도록 할 수 있습니다.

시작 시 데몬의 올바른 동작은 무엇입니까? 특히 스스로 재조정해야 합니까?

답변1

나는 항상 setsid()회의 진행자가 프로세스 제어 및 터미널 신호 작동 방식과 관련이 있다고 생각했습니다. 프로세스 그룹보다 한 수준 위입니다.

Stackoverflow에 대한 답변추천POSIX.1-2008, 내용은 다음과 같습니다.

3,339 회의

작업 제어 목적으로 설정된 프로세스 그룹의 모음입니다. 각 프로세스 그룹은 세션의 구성원입니다. 프로세스는 해당 프로세스 그룹이 속한 세션의 구성원으로 간주됩니다. 새로 생성된 프로세스는 생성자의 세션에 참여합니다. 프로세스는 세션 멤버십을 변경할 수 있습니다. setid()를 참조하세요. 동일한 세션에 여러 프로세스 그룹이 있을 수 있습니다.

그리고제11장다음으로 프로세스 그룹과 세션의 제어 터미널을 기반으로 신호를 전달하는 방법을 설명하겠습니다.

사실, 내가 살펴본 Linux 시스템에서 논리적으로 독립적인 모든 "세션"은 별도의 세션 ID로 실행되었으므로 귀하 가 제안한 login대로 작동합니다 .sshdscreensetsid


데몬이 무엇을 해야 하는지에 관해서는 어떤 초기화 시스템이 사용되는지에 따라 다르다고 생각합니다. Linux에서는 기존 System V init 스크립트를 사용하여 데몬이 자체적으로(또는 보조자의 도움을 받아) 배경을 설정해야 합니다. sysvinit를 사용함에도 불구하고 init 스크립트는 관리자의 셸에서 직접 실행될 수 있으며 이는 모든 경우에 깨끗한 환경이 아닐 수 있습니다. (리소스 제한 등은 세션에서 상속될 수 있습니다.)

Upstart 및 Systemd에서는 init 시스템이 포크를 수행할 수 있으므로 데몬이 자체 포크를 수행하지 않는 것이 더 나을 수 있습니다. (Upstart는 특히 일부 작업을 수행합니다.흥미로운 것들포크된 데몬을 따르세요. )

(다른 유닉스에 대해서는 모르지만 @Stephen Harris가 말했듯이댓글을 달았습니다., 데몬이 분기 및 비분기 동작을 지원하는 것이 좋습니다. )


ssh-agent예를 들어 일반적으로 사용자가 직접 실행하고 init 시스템의 지원이 필요하지 않은 것도 있습니다 . 백그라운드로 포크(used setsid)하고 활성 상태를 유지할 수 있어 여러 셸에서 사용할 수 있다는 점은 매우 유용합니다. ( screenwindows, xterms...) 시작할 때 유용한 출력도 있으므로 실행이 nohup조금 더 복잡합니다.

답변2

선량하게 행동하는 데몬은 데몬이 기대하는 바이므로 스스로 데몬화해야 합니다. 데몬 시작 프레임워크에서 데몬이 시작되지 않은 경우에도 제대로 작동합니다.

제대로 작동하는 데몬에는 감독자에서 시작할 수 있도록 데몬화하지 않는 옵션이 있어야 합니다. (최신 Linux 커널은 듀얼 포크 데몬을 쉽게 모니터링할 수 있지만 모든 시스템이 최신 Linux 커널을 실행하는 것은 아니며 모든 모니터가 최신 Linux 커널을 사용하는 것은 아닙니다.)

관련 정보