Google에서 검색하면 x2 코드 스 니펫이 나타납니다. 첫 번째 결과는 이 코드 레시피에 관한 것인데, 이 코드 레시피 는 아래에 유용한 토론과 함께 많은 문서와 설명이 있습니다.
그러나 다른 문서에는 많은 문서가 포함되어 있지 않지만 시작, 중지 및 다시 시작과 같은 명령을 전달하기위한 샘플 코드가 포함되어 있습니다. 또한 데몬이 이미 실행 중인지 확인하는 데 유용한 PID 파일을 만듭니다.
이 샘플은 모두 데몬을 만드는 방법을 설명합니다. 고려해야 할 추가 사항이 있습니까? 한 샘플이 다른 샘플보다 낫습니까? 왜 그렇습니까?
답변
현재 솔루션
PEP 3143 (표준 데몬 프로세스 라이브러리) 의 참조 구현을 python-daemon으로 사용할 수 있습니다 .
역사적 답변
Sander Marechal의 코드 샘플 은 원래 2004 년에 게시 된 원본보다 우수합니다. Pyro의 데몬 타이 저에 기여한 적이 있었지만 Sander의 코드를 사용해야 할 것입니다.
답변
잘 작동하는 데몬 프로세스 가 될 때주의 해야 할 사항 이 많이 있습니다 .
-
코어 덤프 방지 (많은 데몬이 루트로 실행되며 코어 덤프에는 중요한 정보가 포함될 수 있음)
-
chroot
gaol 안에서 올바르게 행동하다 -
사용 사례에 맞게 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 는 해커 뉴스에 나타나는 비교적 새로운 파이썬 모듈입니다. 꽤 유용하게 보입니다. 스크립트 내부에서 파이썬 스크립트를 데몬 모드로 변환하는 데 사용할 수 있습니다.