문제

저는 Python으로 작성한 도구를 가지고 있으며 일반적으로 데몬으로 실행해야 합니다.배포용으로 이 도구를 패키징하는 모범 사례는 무엇입니까? 특히 설정 파일과 데몬 실행 파일/스크립트를 어떻게 처리해야 합니까?

이와 관련하여 특정 플랫폼에 적합하게 부팅 시 실행되도록 데몬을 설정하는 일반적인 도구가 있습니다(예: 초기화 Linux의 스크립트, Windows의 서비스, 출시됨 OS X에서)?

도움이 되었습니까?

해결책

귀하의 질문 중 한 부분에 대답하자면, Windows나 Mac OS X는 물론이고 Linux 시스템에서도 이식 가능한 데몬 설정을 수행하는 도구가 제가 아는 도구가 없습니다.

대부분의 Linux 배포판은 다음을 사용하는 것 같습니다. start-stop-daemon 이제 init 스크립트 내에서 파일 시스템 레이아웃에는 약간의 차이가 있고 패키징에는 큰 차이가 있습니다.프로젝트가 모두 Python인 경우 autotools/configure 또는 distutils/easy_install을 사용하면 다양한 Linux/BSD 배포판용 패키지를 더 쉽게 빌드할 수 있습니다.

Windows는 완전히 다른 게임이므로 다음이 필요합니다. 마크 해먼드의 win32 확장 프로그램 및 어쩌면 팀 골든의 WMI 확장.

나는 "위의 어느 것도 관련이 없다"는 점을 제외하고는 Launchd를 모릅니다.

Python 스크립트를 데몬화하는 방법에 대한 팁을 보려면 Twisted와 같이 실제 세계에서 실제로 이를 수행하는 Python 앱을 살펴보겠습니다.

다른 팁

init.d 스크립트를 돕기 위해 찾은 가장 좋은 도구는 "시작-스톱 데몬"입니다. 응용 프로그램을 실행하고, 실행/PID 파일을 모니터링하고, 필요할 때 만들고, 데몬을 중지하는 방법을 제공하고, 프로세스 사용자/그룹 ID를 설정하고, 프로세스를 배경으로 할 수 있습니다.

예를 들어, 이것은 WSGI 서버를 시작/중지 할 수있는 스크립트입니다.

#! /bin/bash

case "$1" in
  start)
    echo "Starting server"

    # Activate the virtual environment
    . /home/ali/wer-gcms/g-env/bin/activate

    # Run start-stop-daemon, the $DAEMON variable contains the path to the
    # application to run
    start-stop-daemon --start --pidfile $WSGI_PIDFILE \
        --user www-data --group www-data \
        --chuid www-data \
        --exec "$DAEMON"
    ;;
  stop)
    echo "Stopping WSGI Application"

    # Start-stop daemon can also stop the application by sending sig 15
    # (configurable) to the process id contained in the run/pid file
    start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose
    ;;
  *)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

또한 항상 권장하는 VirtualEnV와 함께 사용하는 방법의 예를 볼 수 있습니다.

인터넷 제공에 많은 스 니펫이 있습니다.

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/깨끗해 보인다 ...

자신의 글을 쓰고 싶다면
원리는 Bash 데몬 기능과 동일합니다.

원래:

시작 :

  • 당신은 다른 과정으로 포크합니다
  • 로그 파일을 열어 stdout 및 stderr를 리디렉션하십시오
  • 어딘가에 PID를 저장하십시오.

정지 :

  • PIDFILE에 저장된 PID를 사용하여 프로세스에 SIGTERM을 보냅니다.
  • Signal.Signal (Signal.Sigterm, SigtermHandler)을 사용하면 정지 절차를 SIGTERT 신호에 바인딩 할 수 있습니다.

그래도 널리 사용되는 패키지 가이 작업을 수행하는 것을 모르겠습니다.

Ben Finney의 데몬 모듈을 확인하십시오. 그는 Python 3.x를 타겟팅하는 PEP를 쓰기 시작했습니다.

http://www.python.org/dev/peps/pep-3143/

그러나 구현은 이미 여기에서 사용할 수 있습니다.

http://pypi.python.org/pypi/python-daemon/

당신이 요구하는 것에 대한은 총알은 아니지만 확인하십시오. 감자. 프로세스 관리의 모든 재미있는 부분을 처리합니다. 나는 큰 생산 환경에서 그것을 많이 사용합니다. 또한 파이썬으로 작성되었습니다!

어디에서 다운로드했는지 기억이 나지 않습니다 ... 그러나 이것은 내가 찾은 최고의 데몬 스크립트입니다. 그것은 아름답게 작동합니다 (Mac과 Linux에서) (Daemonize.py로 저장)

import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    # Perform first fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid( )
    # Perform second fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # The process is now daemonized, redirect standard file descriptors.
    for f in sys.stdout, sys.stderr: f.flush( )
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno( ), sys.stdin.fileno( ))
    os.dup2(so.fileno( ), sys.stdout.fileno( ))
    os.dup2(se.fileno( ), sys.stderr.fileno( ))

스크립트에서는 간단하게 다음과 같습니다.

from daemonize import daemonize
daemonize()

또한 stdio, err 등을 리디렉션 할 장소를 지정할 수도 있습니다.

Linux 시스템에서 시스템 패키지 관리자 (Gentoo의 포티지, Ubuntu/Debian의 적성, Fedora의 Yum 등)는 일반적으로 적절한 장소에 Init Scripts 배치를 포함하여 프로그램 설치를 처리합니다. Linux에 프로그램을 배포하려면 다양한 배포판 패키지 관리자에 대한 적절한 형식으로 번들링 할 수 있습니다.

이 조언은 패키지 관리자가없는 시스템과 관련이 없습니다 (Windows 및 Mac은 생각합니다).

이것 블로그 항목 Python 프로그램을 Deamon으로 실행하는 두 가지 일반적인 방법이 실제로 있다는 것을 분명히했습니다 (기존 답변에서 그렇게 명확하게 생각하지 않았습니다).

파이썬에서 서버와 같은 데몬 응용 프로그램을 작성하는 데 두 가지 접근 방식이 있습니다.

  • 첫 번째는 파이썬 코드 자체의 사트 팅 및 중지의 모든 작업을 처리합니다.. 이것을하는 가장 쉬운 방법은 다음과 같습니다 python-daemon 결국 파이썬 분포에 들어갈 수있는 패키지.

Poeljapon의 대답 사용하지는 않지만이 첫 번째 접근 방식의 예입니다. python-daemon 패키지이지만 사용자 정의이지만 매우 깨끗한 파이썬 스크립트로 연결됩니다.

  • 다른 접근법은 다음과 같습니다 운영 체제가 제공하는 도구를 사용하십시오. 토론의 경우, 이것은 start-stop-daemon프로그램.

Ali Afshar의 답변 두 번째 접근법의 쉘 스크립트 예제입니다. start-stop-daemon.

내가 인용 한 블로그 항목에는 쉘 스크립트 예제가 있으며 시스템 시작시 데몬을 시작하고 어떤 이유로 든 정지했을 때 데몬을 자동으로 다시 시작하는 것과 같은 추가 세부 사항이 있습니다.

잘못되면 나를 바로 잡으십시오. 그러나 질문은 데몬을 배치하는 방법이라고 생각합니다. PIP를 통해 앱을 설치하도록 앱을 설정 한 다음 Entry_Point를 만듭니다. cli(daemon()). 그런 다음 단순히 실행되는 Init 스크립트를 만듭니다 $app_name &

"일반적으로 데몬으로 달려야합니까?"

표면에있는 것은 아닙니다. "일반적으로"는 합리적이지 않습니다. AA 데몬이든 아니든. 질문을 업데이트하고 싶을 수도 있습니다.

데몬의 예는 Apache의 HTTPD 또는 모든 데이터베이스 서버 (데몬) 또는 SMTPD 메일 데몬과 같은 데몬을 읽으십시오.

또는 아마도 FTP 데몬, SSH 데몬, 텔넷 데몬과 같이 더 간단한 것을 읽으십시오.

Linux World에는 응용 프로그램 설치 디렉토리, 일부 작업 디렉토리 및 구성 파일 디렉토리가 있습니다.

우리는 사용 /opt/ourapp 응용 프로그램의 경우 (파이썬이지만 Python의 설치는 없습니다. lib/site-packages)

우리는 사용 /var/ourapp 작업 파일 및 구성 파일의 경우

우리는 사용할 수 있습니다 /etc/ourapp 구성 파일의 경우 일관성이 있지만 그렇지 않습니다.

우리는 아직 - 사용하지 않습니다 init.d 시작을위한 스크립트. 그러나 이것이 최종 작품 인 자동 스타트 업입니다. 지금은 Sys Admins가 데몬을 시작했습니다.

이것은 부분적으로는 기반입니다 http://www.pathname.com/fhs/ 그리고 http://tldp.org/ldp/linux-filesystem-hierarchy/html/linux-filesystem-hierarchy.html.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top