Auto-Restart-System in Python
Frage
Ich muß erkennen, wenn ein Programm abstürzt oder nicht, wird mit Python läuft und neu starten. Ich brauche eine Methode, die nicht unbedingt auf dem Python-Modul verlassen die Eltern-Prozess zu sein.
Ich erwäge eine while-Schleife implementieren, die im Wesentlichen funktioniert
ps -ef | grep process name
und wenn der Prozess nicht gefunden wird es beginnt eine andere. Vielleicht ist dies nicht die effizienteste Methode. Ich bin neu in Python so möglicherweise gibt es ein Python-Modul, das dies bereits der Fall ist.
Lösung
Warum es selbst implementieren? Eine bestehende Dienstprogramm wie Daemon oder Debians start-stop-daemon
ist eher die anderen schwierigen Sachen recht läuft langlebiges-Server abruft Prozesse.
Wie auch immer, wenn Sie den Dienst starten, legte seine pid in /var/run/<name>.pid
und dann ps
Befehl nur für die Prozess-ID aussehen, und prüfen, ob es der richtige Prozess. Unter Linux können Sie einfach auf /proc/<pid>/exe
aussehen zu überprüfen, ob es auf der rechten Seite ausführbare Datei verweist.
Andere Tipps
Bitte nicht neu erfunden init. Ihr Betriebssystem verfügt über Funktionen dieses erforderlich macht fast keine Systemressourcen zu tun und tut es auf jeden Fall besser und zuverlässiger als alles, was Sie wiedergeben können.
Classic Linux hat / etc / inittab
Ubuntu hat /etc/event.d (Emporkömmling)
OS X hat Launchd
Solaris hat smf
Der folgende Code überprüft einen bestimmten Prozess in einem bestimmten Intervall, und startet neu.
#Restarts a given process if it is finished.
#Compatible with Python 2.5, tested on Windows XP.
import threading
import time
import subprocess
class ProcessChecker(threading.Thread):
def __init__(self, process_path, check_interval):
threading.Thread.__init__(self)
self.process_path = process_path
self.check_interval = check_interval
def run (self):
while(1):
time.sleep(self.check_interval)
if self.is_ok():
self.make_sure_process_is_running()
def is_ok(self):
ok = True
#do the database locks, client data corruption check here,
#and return true/false
return ok
def make_sure_process_is_running(self):
#This call is blocking, it will wait for the
#other sub process to be finished.
retval = subprocess.call(self.process_path)
def main():
process_path = "notepad.exe"
check_interval = 1 #In seconds
pm = ProcessChecker(process_path, check_interval)
pm.start()
print "Checker started..."
if __name__ == "__main__":
main()
vielleicht Sie müssen http://supervisord.org
Ich habe es selbst nicht ausprobiert, aber es gibt eine Python Systeminformationen Modul, das können Prozesse verwendet werden und über sie erhalten Informationen zu finden. AFAIR gibt es eine ProcessTable
Klasse, die verwendet werden kann, die laufenden Prozesse zu untersuchen, aber es scheint nicht sehr gut dokumentiert werden ...
würde ich die Befehlszeilen Weg gehen (es ist nur einfacher imho), solange Sie nur jede zweite oder zwei der Ressourcennutzung auf jedem System weniger als 10 Jahre alt zu der zur Verfügung stehenden Verarbeitung verglichen werden Infinitesimalzahl überprüfen sollten.