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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top