Bei der Suche in Google werden x2-Codefragmente angezeigt. Das erste Ergebnis ist dieses Code-Rezept, das viele Dokumentationen und Erklärungen sowie einige nützliche Diskussionen enthält.
Ein anderes Codebeispiel enthält zwar nicht so viel Dokumentation, enthält jedoch Beispielcode zum Übergeben von Befehlen wie Start, Stopp und Neustart. Außerdem wird eine PID-Datei erstellt, mit der überprüft werden kann, ob der Dämon bereits ausgeführt wird usw.
In diesen Beispielen wird erläutert, wie der Dämon erstellt wird. Gibt es zusätzliche Dinge, die berücksichtigt werden müssen? Ist eine Probe besser als die andere und warum?
Antworten:
Aktuelle Lösung
Eine Referenzimplementierung von PEP 3143 (Standard Daemon Process Library) ist jetzt als Python-Daemon verfügbar .
Historische Antwort
Das Codebeispiel von Sander Marechal ist dem Original überlegen, das ursprünglich im Jahr 2004 veröffentlicht wurde. Ich habe einmal einen Daemonizer für Pyro beigesteuert, würde aber wahrscheinlich Sanders Code verwenden, wenn ich ihn noch einmal machen müsste.
quelle
http://pypi.python.org/pypi/python-daemon
. Zuverlässiger. Nur ein Beispiel: Versuchen Sie, zweimal denselben Daemon zu starten mitpython-daemon
: großer hässlicher Fehler. Mit Sanders Code: ein netter Hinweis "Daemon läuft bereits."quit()
Methode, die ausgeführt wird, bevor der Dämon gestoppt wird. Hier ist es.Es gibt viele fummelige Dinge , um die man sich kümmern muss, wenn man ein gut erzogener Daemon-Prozess wird :
Verhindern von Core-Dumps (viele Daemons werden als Root ausgeführt, und Core-Dumps können vertrauliche Informationen enthalten.)
benimm dich korrekt in einem
chroot
GefängnisStellen Sie UID, GID, Arbeitsverzeichnis, umask und andere Prozessparameter entsprechend dem Anwendungsfall ein
verzichten erhöht
suid
,sgid
PrivilegienSchließen Sie alle geöffneten Dateideskriptoren mit Ausschlüssen je nach Anwendungsfall
korrekt verhalten , wenn innerhalb eines bereits abgelöst Kontext gestartet, wie
init
,inetd
etc.Richten Sie Signalhandler für ein vernünftiges Daemon-Verhalten ein, aber auch für bestimmte Handler, die vom Anwendungsfall bestimmt werden
die Standardströme umlenken
stdin
,stdout
,stderr
da verfügt über einen Dämon - Prozess nicht länger einen SteuerterminalBehandeln Sie eine PID-Datei als kooperative Beratungssperre. Dies ist eine ganze Dose Würmer an sich mit vielen widersprüchlichen, aber gültigen Verhaltensweisen
Ermöglichen Sie eine ordnungsgemäße Bereinigung, wenn der Prozess beendet ist
tatsächlich ein Dämonprozess werden, ohne zu Zombies zu führen
Einige davon sind Standard , wie in der kanonischen Unix-Literatur beschrieben ( Advanced Programming in the UNIX Environment , von dem verstorbenen W. Richard Stevens, Addison-Wesley, 1992). Andere, wie die Stream-Umleitung und die Behandlung von PID-Dateien , sind herkömmliches Verhalten, das die meisten Daemon-Benutzer erwarten würden, das jedoch weniger standardisiert ist.
All dies wird in der PEP 3143- Spezifikation „Standard Daemon Process Library“ abgedeckt . Die Python-Daemon- Referenzimplementierung funktioniert unter Python 2.7 oder höher und Python 3.2 oder höher.
quelle
Hier ist mein grundlegender Python-Daemon 'Howdy World', mit dem ich beginne, wenn ich eine neue Daemon-Anwendung entwickle.
Beachten Sie, dass Sie die
python-daemon
Bibliothek benötigen . Sie können es installieren durch:Dann starten Sie es einfach mit
./howdy.py start
und beenden Sie es mit./howdy.py stop
.quelle
daemon
Ihnen importierte Modul ist (noch) kein Standardbestandteil von Python. Es muss mitpip install python-daemon
oder gleichwertig installiert werden .Beachten Sie das Python-Daemon- Paket, das viele Probleme hinter Daemons sofort löst.
Unter anderem ermöglicht es (aus der Debian-Paketbeschreibung):
quelle
Eine Alternative: Erstellen Sie ein normales, nicht dämonisiertes Python-Programm und dämonisieren Sie es dann extern mit Supervisord . Dies kann viele Kopfschmerzen ersparen und ist * nix- und sprachübertragbar.
quelle
Wahrscheinlich keine direkte Antwort auf die Frage, aber systemd kann verwendet werden, um Ihre Anwendung als Daemon auszuführen. Hier ist ein Beispiel:
Ich bevorzuge diese Methode, weil ein Großteil der Arbeit für Sie erledigt wird und sich Ihr Daemon-Skript dann ähnlich wie der Rest Ihres Systems verhält.
-Oder von
quelle
systemctl start control.service
YapDi ist ein relativ neues Python-Modul, das in Hacker News aufgetaucht ist. Sieht ziemlich nützlich aus und kann verwendet werden, um ein Python-Skript aus dem Skript heraus in den Daemon-Modus zu konvertieren.
quelle
Da Python-Daemon Python 3.x noch nicht unterstützt hat und von dem, was auf der Mailingliste zu lesen ist, möglicherweise nie gelesen wird, habe ich eine neue Implementierung von PEP 3143 geschrieben: pep3143daemon
pep3143daemon sollte mindestens Python 2.6, 2.7 und 3.x unterstützen
Es enthält auch eine PidFile-Klasse.
Die Bibliothek hängt nur von der Standardbibliothek und den sechs Modulen ab.
Es kann als Ersatz für Python-Daemon verwendet werden.
Hier ist die Dokumentation .
quelle
Diese Funktion wandelt eine Anwendung in einen Daemon um:
quelle
Ich fürchte, das von @Dustin erwähnte Daemon-Modul hat bei mir nicht funktioniert. Stattdessen habe ich python-daemon installiert und den folgenden Code verwendet:
Laufen ist einfach
Nur der Vollständigkeit halber ist hier der Inhalt des Samplemodul-Verzeichnisses aufgeführt
Der Inhalt von moduleclass.py kann sein
quelle
Noch etwas zu beachten, wenn Sie in Python dämonisieren:
Wenn Sie die Python- Protokollierung verwenden und diese nach der Dämonisierung weiter verwenden möchten, müssen Sie
close()
die Handler (insbesondere die Datei-Handler) aufrufen .Wenn Sie dies nicht tun, kann der Handler immer noch glauben, dass Dateien geöffnet sind, und Ihre Nachrichten verschwinden einfach - mit anderen Worten, stellen Sie sicher, dass der Logger weiß, dass seine Dateien geschlossen sind!
Dies setzt voraus, dass Sie beim Dämonisieren ALLE offenen Dateideskriptoren wahllos schließen. Stattdessen können Sie versuchen, alle außer den Protokolldateien zu schließen (in der Regel ist es jedoch einfacher, alle zu schließen und die gewünschten Dateien erneut zu öffnen).
quelle
Obwohl Sie vielleicht die reine Python-Lösung bevorzugen, die vom Python-Daemon-Modul bereitgestellt wird, gibt es
daemon(3)
inlibc
- zumindest unter BSD und Linux - eine Funktion , die das Richtige tut.Es ist einfach, es von Python aus aufzurufen:
Das einzige, was noch zu tun ist, ist das Erstellen (und Sperren) der PID-Datei. Aber dass du damit umgehen kannst ...
quelle
Ich habe einige Zeilen im Codebeispiel von Sander Marechal (von @JeffBauer in der akzeptierten Antwort erwähnt ) geändert , um eine
quit()
Methode hinzuzufügen , die ausgeführt wird, bevor der Dämon gestoppt wird. Dies ist manchmal sehr nützlich.Hier ist es.
Hinweis: Ich verwende das Modul "Python-Daemon" nicht, da die Dokumentation noch fehlt (siehe auch viele andere SO-Fragen) und ziemlich unklar ist (wie man einen Daemon mit diesem Modul ordnungsgemäß über die Befehlszeile startet / stoppt?).
quelle
Nach ein paar Jahren und vielen Versuchen (ich habe alle hier gegebenen Antworten ausprobiert, aber alle hatten am Ende kleinere Nachteile), ist mir jetzt klar, dass es einen besseren Weg gibt, als einen Daemon direkt von Python aus zu starten, zu stoppen und neu zu starten : Verwenden Sie stattdessen die Betriebssystem-Tools.
Zum Beispiel mache ich für Linux anstelle von
python myapp start
undpython myapp stop
Folgendes, um die App zu starten:oder um es in einem Befehl
screen -dmS myapp python myapp.py
zu starten und zu trennen .Dann:
wieder an dieses Terminal anschließen. Sobald Sie sich im Terminal befinden, können Sie es mit STRG + C stoppen.
quelle
Der einfachste Weg, einen Daemon mit Python zu erstellen, ist die Verwendung des ereignisgesteuerten Twisted -Frameworks. Es erledigt alle für die Dämonisierung erforderlichen Dinge für Sie. Es verwendet das Reaktormuster , um gleichzeitige Anforderungen zu verarbeiten.
quelle
In 80% der Fälle, wenn Leute "Daemon" sagen, wollen sie nur einen Server. Da die Frage in diesem Punkt völlig unklar ist, ist es schwer zu sagen, welche Antwortdomäne möglich sein könnte. Da ein Server ausreichend ist, starten Sie dort. Wenn tatsächlich ein tatsächlicher "Daemon" benötigt wird (dies ist selten), lesen Sie weiter
nohup
, um einen Server zu dämonisieren.Bis ein tatsächlicher Daemon tatsächlich benötigt wird, schreiben Sie einfach einen einfachen Server.
Schauen Sie sich auch die WSGI-Referenzimplementierung an .
Schauen Sie sich auch den Simple HTTP Server an .
„Gibt es zusätzliche Dinge, die berücksichtigt werden müssen?“ Ja. Über eine Million Dinge. Welches Protokoll? Wie viele Anfragen? Wie lange kann jede Anfrage bearbeitet werden? Wie oft werden sie ankommen? Verwenden Sie einen dedizierten Prozess? Themen? Unterprozesse? Einen Daemon zu schreiben ist eine große Aufgabe.
quelle
fork()
, geschweige denn zwei. Sie haben nichts mit Dämonisierung zu tun.crond
odersyslogd
- Housekeeping-Dienste für das gesamte System ausführen. Um einen Daemon-Prozess zu erstellen, muss mindestens ein Double ausgeführt werden,fork()
wobei alle Dateideskriptoren geschlossen sind, damit man gegen Signale von allen steuernden Terminals, einschließlich der Systemkonsole, immun ist. Siehe die Antwort von Bignose.SimpleHTTPServer
ist in der Tat ein Server, aber einer, der nicht von Haus aus weiß, wie man sich selbst dämonisiert (Sie können ihn beispielsweise mit Strg-C drücken).nohup
ist ein Dienstprogramm zum Dämonisieren eines naiven Prozesses. Ihr Nohupped-Server ist also in der Tat sowohl ein Dämon als auch ein Server, genau wie Sie behaupten. Diese Frage zum Stapelüberlauf lautete im Wesentlichen: "Wie kann ichnohup
in Python implementieren ?"nohup
ist ein gutes Werkzeug, und ich werde meine -1-Stimme entfernen, wenn Sie diese nützliche Idee einfach in Ihre eigentliche Antwort übernehmen. In der Tat, wenn Sie erwähnensupervisord
und wie es den Autor auch davon abhält, Protokollierung, ein Start-Stopp-Skript und eine Neustartdrosselung durchzuführen, dann werde ich Sie sogar +1. :)