파이썬에서 데몬을 어떻게 만드나요? 많은 문서와 설명이 있습니다. 그러나 다른

Google에서 검색하면 x2 코드 스 니펫이 나타납니다. 첫 번째 결과는 이 코드 레시피에 관한 것인데, 이 코드 레시피 는 아래에 유용한 토론과 함께 많은 문서와 설명이 있습니다.

그러나 다른 문서에는 많은 문서가 포함되어 있지 않지만 시작, 중지 및 다시 시작과 같은 명령을 전달하기위한 샘플 코드가 포함되어 있습니다. 또한 데몬이 이미 실행 중인지 확인하는 데 유용한 PID 파일을 만듭니다.

이 샘플은 모두 데몬을 만드는 방법을 설명합니다. 고려해야 할 추가 사항이 있습니까? 한 샘플이 다른 샘플보다 낫습니까? 왜 그렇습니까?



답변

현재 솔루션

PEP 3143 (표준 데몬 프로세스 라이브러리) 의 참조 구현을 python-daemon으로 사용할 수 있습니다 .

역사적 답변

Sander Marechal의 코드 샘플 은 원래 2004 년에 게시 된 원본보다 우수합니다. Pyro의 데몬 타이 저에 기여한 적이 있었지만 Sander의 코드를 사용해야 할 것입니다.


답변

잘 작동하는 데몬 프로세스 가 될 때주의 해야사항많이 있습니다 .

  • 코어 덤프 방지 (많은 데몬이 루트로 실행되며 코어 덤프에는 중요한 정보가 포함될 수 있음)

  • chrootgaol 안에서 올바르게 행동하다

  • 사용 사례에 맞게 UID, GID, 작업 디렉토리, umask 및 기타 프로세스 매개 변수 설정

  • 승계 suid, sgid특권 포기

  • 사용 사례에 따라 제외 된 모든 열린 파일 디스크립터를 닫습니다.

  • 이미 분리 된 컨텍스트 내에서 시작하는 경우, 제대로 동작 등 init, inetd

  • 현명한 데몬 동작에 대한 신호 처리기를 설정하고 사용 사례에 따라 결정된 특정 처리기를 사용합니다.

  • 표준 스트림을 리디렉션하는 것은 stdin, stdout, stderr데몬 프로세스는 더 이상 제어 단자가 없기 때문에

  • PID 파일을 협력 적 자문 잠금으로 처리합니다.이 잠금은 많은 모순적이지만 유효한 동작 방식을 가진 웜 자체 입니다.

  • 프로세스가 종료 될 때 적절한 정리 허용

  • 실제로 좀비이어지지 않고 데몬 프로세스가됩니다.

표준 유닉스 문헌 ( UNIX 환경의 고급 프로그래밍 , W. Richard Stevens, Addison-Wesley, 1992)에 설명 된대로 이들 중 일부는 표준 입니다. 이러한 스트림 재와 같은 다른, PID 파일 처리는 ,있는 기존의 행동에 대부분의 데몬 사용자가 기대하는 것하지만 덜 표준화되어있다.

이 모든 것들은 PEP 3143 “표준 데몬 프로세스 라이브러리”사양에서 다룹니다 . 파이썬 데몬 참조 구현은 이상 파이썬 2.7에서 작동하고, 나중에 파이썬 3.2.


답변

다음은 새로운 데몬 응용 프로그램을 개발할 때 시작하는 기본 ‘Howdy World’Python 데몬입니다.

#!/usr/bin/python
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/foo.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            print("Howdy!  Gig'em!  Whoop!")
            time.sleep(10)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

python-daemon라이브러리 가 필요합니다 . 다음을 통해 설치할 수 있습니다.

pip install python-daemon

그런 다음로 시작하고로 ./howdy.py start중지하십시오 ./howdy.py stop.


답변

노트 파이썬 데몬 상자에서 데몬 뒤에 많은 문제를 해결 패키지를.

다른 기능들 중에서도 데비안 패키지 설명에서 가능합니다 :

  • 프로세스를 자체 프로세스 그룹으로 분리하십시오.
  • chroot 내에서 실행하기에 적합한 프로세스 환경을 설정하십시오.
  • suid 및 sgid 권한을 포기하십시오.
  • 열려있는 모든 파일 설명자를 닫습니다.
  • 작업 디렉토리, uid, gid 및 umask를 변경하십시오.
  • 적절한 신호 처리기를 설정하십시오.
  • stdin, stdout 및 stderr에 대한 새 파일 디스크립터를여십시오.
  • 지정된 PID 잠금 파일을 관리하십시오.
  • 종료 처리를위한 정리 기능을 등록하십시오.

답변

대안-일반적인 비 데몬 (non-demonized) 파이썬 프로그램을 생성 한 다음 supervisord를 사용하여 외부 적으로 데몬을 초기화하십시오 . 이것은 많은 두통을 줄여 줄 수 있으며 * nix 및 언어 이식이 가능합니다.


답변

아마도 질문에 대한 직접적인 대답은 아니지만 systemd를 사용하여 응용 프로그램을 데몬으로 실행할 수 있습니다. 예를 들면 다음과 같습니다.

[Unit]
Description=Python daemon
After=syslog.target
After=network.target

[Service]
Type=simple
User=<run as user>
Group=<run as group group>
ExecStart=/usr/bin/python <python script home>/script.py

# Give the script some time to startup
TimeoutSec=300

[Install]
WantedBy=multi-user.target

많은 작업이 완료되었으므로 데몬 스크립트가 나머지 시스템과 유사하게 작동하기 때문에이 방법을 선호합니다.

오비


답변

YapDi 는 해커 뉴스에 나타나는 비교적 새로운 파이썬 모듈입니다. 꽤 유용하게 보입니다. 스크립트 내부에서 파이썬 스크립트를 데몬 모드로 변환하는 데 사용할 수 있습니다.