Wie führe ich ein Python-Skript im Hintergrund aus und starte es nach einem Absturz neu?

10

Ich habe ein sehr einfaches Python-Skript, das ich immer auf meinem Ubuntu 12.04-Server ausführen möchte. Ich dachte an Upstart + Monit. Das Problem ist, dass diese Tools für einen einfachen Sterblichen wie mich ziemlich kompliziert erscheinen und ich im Web kein einfaches Beispiel finden kann.

Ist Emporkömmling + Monit Overkill? Kennt jemand eine einfachere Alternative oder ein gutes Tutorial für Upstart + Monit? Wenn ich nur sichergehen möchte, dass das Skript immer ausgeführt wird, ist überhaupt eine Überwachung erforderlich?

sebpiq
quelle
Als Referenz wurde genau die gleiche Frage gestellt hier: superuser.com/q/461546/786969
PHPirate

Antworten:

16

Der einfachste Weg, dies zu tun, ist dies in /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn startet es wieder, wenn es getötet wird oder ungleich Null beendet wird (wie eine nicht erfasste Ausnahme). Dies funktioniert ab Ubuntu 10.04.

Wenn Sie 12.04 haben, können Sie mehr Phantasie bekommen. Das obige führt Ihr Skript als root aus. In 12.04 können Sie setuid / setgid hinzufügen:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Wenn Ihr Skript beendet wird, wenn kein Netzwerk verfügbar ist und Sie planen, es auf einer instabilen Netzwerkverbindung auszuführen, sollten Sie dies beheben und es einfach am Leben erhalten / erneut versuchen. Wenn Sie dies nicht können, müssen Sie es möglicherweise auch manuell starten, wenn ein Netzwerkgerät gestartet wird. Sie können dies also in platzieren /etc/network/if-up.d/yourscript(mit chmod + x ausführbar machen)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Wobei Ihr Skript nur etwas Willkürliches und Einzigartiges für dieses bestimmte Skript ist und "etwas" mit dem Jobnamen identisch ist (wie der /etc/init/something.confzuvor vorgeschlagene).

SpamapS
quelle
Ja! Also das ist upstartrichtig? Bedeutet dies, dass das Skript auch beim Booten gestartet wird (was großartig wäre!)? Und respawnist genug, damit Sie nicht einrichten müssen monit?
Sebpiq
Ja, "Start auf Runlevel [2345]" bedeutet zu dem Zeitpunkt, zu dem das System in den "Mehrbenutzermodus" wechselt. Langfristig wird ein Plan erstellt, um das sehr alte unixy "Runlevel" durch Dinge wie "Start beim Starten von Netzwerkdiensten" und "Stopp beim Stoppen von Netzwerkdiensten" zu ersetzen, damit es logischer liest.
SpamapS
Genial ! Vielen Dank, genau das habe ich gebraucht.
Sebpiq
2

Der übliche Ansatz aus alten Zeiten bestand darin, eine Datei mit einem Zeitstempel oder der Prozess-ID zu schreiben /tmpund dann zu überprüfen, ob diese Prozess-ID noch ausgeführt wurde oder ob der Zeitstempel noch aktuell war.

Sie können auch eine einfache while [ 1 ]; do phyton-script.ph; doneMethode ausführen, mit der das Skript neu gestartet wird, falls es zurückkehrt.

Für weitere Möglichkeiten geben Sie bitte weitere Informationen zu Ihrem Skript an. Vor allem, wenn Sie erwarten, dass es unerwartet beendet wird oder abstürzt.

verwechseln
quelle
Das Skript verschrottet nur Tweets von Twittern mithilfe einer Streaming-API. Im Grunde gibt es eine Endlosschleife, die darauf wartet, dass Tweets gesendet werden, Code ausgeführt wird und wieder gewartet wird. Ich möchte nur, dass dies ohne Sorge läuft ... wenn es einen Fehler gibt und er abstürzt und so weiter ...
sebpiq
Eine ähnliche Antwort auf Ihre (die ich angenommen): superuser.com/questions/461546/...
sebpiq
Auch ein Cron-Job, um zu überprüfen, ob das Skript noch ausgeführt wird, ist möglicherweise eine gute Idee.
con-f-use