Frage

Ich habe ein Werkzeug, das ich in Python geschrieben haben und in der Regel als Daemon ausgeführt werden soll. Was sind die besten Praktiken für die Verpackung dieses Tool für den Vertrieb, vor allem, wie sollten Einstellungsdateien und der Dämon ausführbare / script behandelt werden?

Im Zusammenhang damit gibt es keine gemeinsamen Werkzeuge zur Einstellung der Daemon für den Betrieb beim Booten als geeignet für die jeweilige Plattform (dh init Skripte auf Linux, Dienste auf Fenster, launchd auf os x)?

War es hilfreich?

Lösung

Um einen Teil Ihrer Frage zu beantworten, gibt es keine Werkzeuge, die ich kenne, dass Daemon Setup tun portably auch über Linux-Systeme allein Windows oder Mac OS X lassen.

Die meisten Linux-Distributionen scheinen nun mit start-stop-daemon innerhalb Init-Skripte werden, aber du bist immer noch kleiner Unterschied in Dateisystem-Layout und große Unterschiede in der Verpackung haben. Mit Autotool / konfiguriert oder distutils / easy_install, wenn Ihr Projekt all Python ist, wird einen langen Weg zu machen es einfache Pakete für verschiedene Linux / BSD-Distributionen zu bauen.

Windows ist ein ganz anderes Spiel und Mark Hammonds win32 Erweiterungen und vielleicht Tim Goldens WMI Erweiterungen.

Ich weiß nicht, Launchd außer, dass „keine der oben genannten“ relevant ist.

Für Spitzen auf Skripten Python daemonizing, ich Python-Anwendungen aussehen würde, die tatsächlich in der realen Welt zu tun, zum Beispiel innerhalb Verdrehte.

Andere Tipps

Das beste Werkzeug, das ich für die Hilfe bei init.d Skripte gefunden ist „start-stop-daemon“. Es wird keine Anwendung, Monitor run / pid-Dateien auszuführen, erstellen Sie sie, wenn nötig, bieten Möglichkeiten, den Dämon, setzen Prozess Benutzer / Gruppen-IDs, und kann sogar Hintergrund Ihren Prozess zu stoppen.

Zum Beispiel ist dies ein Skript, das einen wsgi Server starten / stoppen:

#! /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

Sie können auch ein Beispiel dafür, wie es mit einem virtualenv zu verwenden, die ich würde immer empfehlen.

Es gibt viele Schnipsel im Internet-Angebote einen Daemon in reinem Python (kein Bash-Skripte)

schreiben

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python / sieht sauber ...

Wenn Sie eine eigene,
schreiben wollen das Prinzip ist das gleiche wie bei der bash-Dämon-Funktion.

Grundsätzlich gilt:

Beim Start:

  • Sie an einen anderen Prozess Gabel
  • Öffnen einer Log-Datei zu umleiten Ihre stdout und stderr
  • Speichern Sie die pid irgendwo.

Auf stop:

  • Sie senden SIGTERM an den Prozess mit pid in Ihrem pidfile gespeichert.
  • Mit signal.signal (signal.SIGTERM, sigtermhandler) Sie können ein Anhalten binden Verfahren zum SIGTERM Signal.

Ich weiß nicht weit verbreitetes Paket dies allerdings tun.

Überprüfen Sie den Daemon-Moduls Ben Finney. Er hat damit begonnen, einen PEP-Targeting Python 3.X zu schreiben:

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

Aber eine Implementierung ist bereits hier:

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

kein Allheilmittel für das, was Sie fragen, aber überprüfe supervisord . Es kümmert sich um alle Spaß Bits Verwaltung von Prozessen. Ich benutze es schwer in einer großen Produktionsumgebung. Außerdem ist es in Python geschrieben!

Ich kann mich nicht erinnern, wo ich es heruntergeladen ... aber das ist das beste daemonizing-Skript, das ich gefunden habe. Es funktioniert wunderbar (auf Mac und Linux.) (Als daemonize.py speichern)

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( ))

In Ihrem Skript, würden Sie einfach:

from daemonize import daemonize
daemonize()

Und Sie können auch Orte geben Sie die stdio umleiten, äh, etc ...

Auf Linux-Systemen des Paketmanager des Systems (Portage für Gentoo, Eignungsfeststellungs für Ubuntu / Debian, yum für Fedora, etc.) dauert in der Regel Pflegt das Programm der Installation Init-Skripte in den richtigen Stellen einschließlich platzieren. Wenn Sie Linux Ihr Programm verteilen möchten, möchten Sie vielleicht zu prüfen, sie zu bündeln für verschiedene Distributionen Paketmanager in das richtige Format auf.

Diese Beratung ist offensichtlich irrelevant auf Systemen, die (Windows und Mac glaube ich) nicht Paket-Manager haben.

Dieses Blogeintrag rel="nofollow es für mich klar, dass es gibt tatsächlich zwei gemeinsame Möglichkeiten, um Ihr Python-Programm läuft als deamon haben (ich nicht herausgefunden hatte, so deutlich von den vorhandenen Antworten):

  

Es gibt zwei Ansätze zum Schreiben Daemon Anwendungen wie Server   in Python.

     
      
  • Die erste ist auf behandeln alle Aufgaben von sarting und   Stoppen Daemons in Python-Code selbst . Der einfachste Weg, dies zu tun ist   mit dem python-daemon Paket, das schließlich seinen Weg machen könnte   in die Python-Distribution.
  •   

Poeljapon Antwort ist ein Beispiel für diesen ersten Ansatz, obwohl es nicht das python-daemon Paket verwendet, sondern Links zu ein Brauch, aber sehr sauber python-Skript.

  
      
  • Der andere Ansatz ist auf Werkzeuge   vom Betriebssystem geliefert . Im Fall von Debain bedeutet dies,   einen Init-Skript schreiben, die Verwendung des start-stop-daemon macht   Programm.
  •   

Ali Afshar Antwort ist ein Shell-Skript Beispiel für den zweiten Ansatz, die start-stop-daemon verwendet wird.

Der Blog-Eintrag Ich zitierte hat ein Shell-Skript Beispiel, und einige zusätzliche Details über Dinge wie Ihr Daemon beim Systemstart starten und einen Neustart des Daemon automatisch, wenn es aus irgendeinem Grund gestoppt.

korrigieren Sie mich falsch, wenn, aber ich glaube, die Frage ist, wie der Dämon zu implementieren. Legen Sie Ihre App über pip zu installieren und dann die entry_point eine cli(daemon()) zu machen. Dann einen Init-Skript erstellen, die einfach $app_name & läuft

"im Allgemeinen als Daemon ausgeführt werden soll?"

Ist nicht - auf der Oberfläche - sehr viel Sinn machen. „Im Allgemeinen“ ist nicht sinnvoll. Es ist entweder ein ein Dämon oder nicht. Vielleicht möchten Sie Ihre Frage aktualisieren.

Für Beispiele von Dämonen, lesen Sie auf Daemons wie httpd des Apache oder jeder Datenbank-Server (sie sind Daemons) oder der SMTPD Mail-Daemon.

Oder vielleicht lesen Sie auf etwas einfacher, wie der FTP-Daemon, SSH-Daemon, Telnet Daemon.

In Linux-Welt, werden Sie Ihre Anwendung Installationsverzeichnis haben, einige Arbeitsverzeichnis sowie die Konfigurationsdatei Verzeichnisse.

Wir verwenden /opt/ourapp für die Anwendung (es ist Python, aber wir nicht installieren in Python lib/site-packages)

Wir verwenden /var/ourapp für Arbeitsdateien und unsere Konfigurationsdateien.

Wir /etc/ourapp für Konfigurationsdateien verwenden könnte - es wäre konsistent -. Aber wir nicht

Wir tun - noch - nicht verwenden, um die init.d Skripte für die Inbetriebnahme. Aber das ist das letzte Stück, automatischer Start. Denn jetzt haben wir beginnen Systemadministratoren die Daemons.

Dies beruht zum Teil auf http://www.pathname.com/fhs/ und http://tldp.org/LDP/ Linux-Dateisystem-Hierarchie / html / Linux-Filesystem-Hierarchy.html .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top