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

8

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

Ist Upstart + Monit Overkill? Kennt jemand eine einfachere Alternative oder ein gutes Tutorial für upstart + monit? Wenn ich nur sicher sein möchte, dass das Skript immer läuft, ist überhaupt ein Monitor erforderlich?

    
sebpiq 14.08.2012, 16:32

2 Antworten

15

Am einfachsten 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 nicht-Null (wie eine nicht abgefangene Ausnahme) verlässt. Das wird nach Ubuntu 10.04 funktionieren.

Wenn Sie 12.04 haben, können Sie mehr Phantasie bekommen. Das oben genannte Skript wird als root ausgeführt. 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 es auf einer instabilen Netzwerkverbindung ausführen wollen, sollten Sie das Problem beheben und es einfach am Leben erhalten / wiederholen. Wenn dies nicht möglich ist, müssen Sie es möglicherweise auch manuell starten lassen, wenn ein Netzwerkgerät auftaucht. So können Sie dies in /etc/network/if-up.d/yourscript (machen Sie es ausführbar mit chmod + x)

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

Dabei ist yorskript nur etwas Willkürliches und Einzigartiges für dieses spezielle Skript, und "etwas" ist dasselbe wie der Jobname (wie zB das /etc/init/something.conf , das früher vorgeschlagen wurde).

    
SpamapS 16.08.2012, 06:16
2

Der übliche Ansatz der alten Tage war, eine Datei mit einem Zeitstempel oder der Prozess-ID nach /tmp zu schreiben und dann zu überprüfen, ob diese Prozess-ID noch lief oder ob der Zeitstempel noch aktuell war.

>

Sie könnten auch eine einfache while [ 1 ]; do phyton-script.ph; done ausführen, die das Skript neu startet, falls es zurückkommt.

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

    
con-f-use 14.08.2012 16:46

Tags und Links