2013-07-19 3 views
34

Ich habe ein Modul in Python geschrieben und möchte es kontinuierlich ausgeführt, sobald es gestartet wird und muss es stoppen, wenn ich andere Module aktualisieren muss. Ich werde wahrscheinlich Monit verwenden, um es neu zu starten, wenn das Modul abgestürzt ist oder sonst nicht ausgeführt wird.Daemon vs Upstart für Python-Skript

Ich ging durch verschiedene Techniken wie Daemon, Upstart und viele andere.

Welches ist der beste Weg zu gehen, so dass ich diesen Ansatz durch alle meine neuen Module verwenden, um sie für immer laufen zu lassen?

Antwort

67

Von Ihrer Erwähnung von Upstart werde ich annehmen, dass diese Frage für einen Dienst ist, der auf einem Ubuntu-Server ausgeführt wird.

Auf einem Ubuntu-Server ist ein Upstart-Job wirklich die einfachste und bequemste Option zum Erstellen eines ständig aktiven Dienstes, der zur richtigen Zeit gestartet und mit bekannten Befehlen gestoppt oder neu geladen werden kann.

Um einen Upstart-Service zu erstellen, müssen Sie eine einzige Datei zu /etc/init hinzufügen. Genannt <service-name>.conf. Ein Beispielskript sieht wie folgt aus:

description "My chat server" 
author "[email protected]" 

start on runlevel [2345] 
stop on runlevel [!2345] 

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set 

respawn 

exec /srv/applications/chat.py 

Das bedeutet, dass jedes Mal wenn die Maschine gestartet wird, wird es das chat.py Programm starten. Wenn es aus irgendeinem Grund stirbt, wird es neu gestartet. Sie müssen sich keine Gedanken darüber machen, wie Sie Ihren Code doppelt verzweigen oder anderweitig dämonisieren. Das ist für Sie von Emporkömmling behandelt.

Wenn Sie Ihren Prozess zu stoppen oder starten Sie können dies tun, mit

service chat start 
service chat stop 

Der Name chat wird automatisch aus dem Namen der .conf Datei in /etc/init

fand ich nur die Bedeckung Grundlagen des Emporkömmlings hier. Es gibt viele andere Funktionen, um es noch nützlicher zu machen. Alle verfügbar durch Ausführen von man upstart.

Diese Methode ist viel bequemer, als Ihren eigenen Daemonisierungscode zu schreiben. Eine Konfigurationsdatei mit 4-8 Zeilen für eine eingebaute Ubuntu-Komponente ist viel weniger fehleranfällig, als wenn du deinen Code sicher doppelt verzweigst und dann einen anderen Prozess hast, der ihn überwacht, um sicherzustellen, dass er nicht verschwindet.

Monit ist ein bisschen wie ein Hering. Wenn Sie Ausfallwarnungen benötigen, müssen Sie ein Überwachungsprogramm auf einem separaten Server Server sowieso ausführen. Verlassen Sie sich auf den Neustart, damit der Prozess immer auf einem Server ausgeführt wird. Stellen Sie dann einen anderen Dienst bereit, der sicherstellt, dass der Server tatsächlich ausgeführt wird. Ausfallzeiten treten aus verschiedenen Gründen auf. Ein Prozess, der auf demselben Server ausgeführt wird, sagt Ihnen genau dann nichts, wenn der Server selbst ausfällt. Sie benötigen einen separaten Computer (oder einen Drittanbieter wie Pingdom), um Sie über diesen Zustand zu informieren.

+0

Gibt es eine authentische Quelle, die Ihre Antwort unterstützt? Das Ausführen auf Ubuntu ist eine Option, aber nicht zwingend (daemonize funktioniert bei beiden). Zweitens müssen Sie monit sogar mit Emporkömmling verwenden, um Ausfallwarnungen zu erhalten. – mtariq

+0

Sie können eine E-Mail erhalten, wenn Sie beim Starten/Stoppen eine E-Mail senden (http://serverfault.com/questions/236925/how-can-i-receive-an-email-when-an-upstart-monovited-script-respawns) . authentische Quelle? Menschen nutzen den Emporkömmling überall in der Produktion. Wir verwenden Upstart in der Produktion Sie können monit nicht für Ausfallalarme verwenden. Es ist zwecklos. Siehe bearbeitete Antwort für den Grund warum. – aychedee

+0

Toller Beitrag. Upstart befindet sich im Debian-Baum, daher kann es wahrscheinlich in Vanilla Debian oder Mint sowie anderen Derivaten verwendet werden. – meawoppl

3

habe ich im alten Stil Init-Skript mit Start-Stopp-Daemon utility.Look bei skel in /etc/init.d

5

Sie supervisor überprüfen können. Es ist in der Lage, einen Prozess beim Systemstart zu starten und ihn dann bis zum Herunterfahren am Leben zu halten.

wäre die einfachste Konfigurationsdatei sein:

[program:my_script] 
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py 
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR 
autostart = True 
autorestart = True 

Dann könnten Sie es auf /etc/supervisord/conf.d verknüpfen, führen sudo supervisorctl Management-Konsole des Betreuers, geben Sie in reread so dass Supervisor bemerkt neuer Konfigurationseintrag und update anzuzeigen neu eingeben Programme auf der status Liste.

Zum Starten/Neustarten/Stoppen eines Programms können Sie sudo supervisorctl start/restart/stop my_script ausführen.

+0

Ein allgemeiner Hinweis für Leser, dass Supervisor nicht mit Python 3 funktioniert. – shongololo