2012-11-28 8 views
5

Ich versuche, ständig einen Prozess zu überwachen, der im Grunde ein Python-Programm ist. Wenn das Programm stoppt, muss ich das Programm erneut starten. Ich benutze ein anderes Python-Programm, um dies zu tun.Überwachen Sie ständig ein Programm/Prozess mit Python

Zum Beispiel sagen, ich muss ständig einen Prozess namens run_constantly.py ausführen. Ich führe dieses Programm zunächst manuell aus, das seine Prozess-ID in die Datei "PID" schreibt (in den Speicherort out/PROCESSID/PID).

Jetzt laufe ich ein anderes Programm, das die folgenden Code hat das Programm run_constantly.py von einer Linux-Umgebung zu überwachen:

def Monitor_Periodic_Process(): 

    TIMER_RUNIN = 1800 
    foo = imp.load_source("Run_Module","run_constantly.py") 
    PROGRAM_TO_MONITOR = ['run_constantly.py','out/PROCESSID/PID'] 
    while(1): 
     # call the function checkPID to see if the program is running or not 
     res = checkPID(PROGRAM_TO_MONITOR) 
     # if res is 0 then program is not running so schedule it 
     if (res == 0): 
      date_time = datetime.now() 
      scheduler.add_cron_job(foo.Run_Module, year=date_time.year, day=date_time.day, month=date_time.month, hour=date_time.hour, minute=date_time.minute+2) 
      scheduler.start() 
      scheduler.get_jobs() 
      time.sleep(TIMER_NOT_RUNIN) 
      continue 
     else: 
      #the process is running sleep and then monitor again 
      time.sleep(TIMER_RUNIN) 
      continue 

ich nicht die checkPID() Funktion hier aufgenommen haben. checkPID() überprüft grundsätzlich, ob die Prozess-ID noch existiert (d. H. Wenn das Programm noch läuft) und wenn sie nicht existiert, gibt sie 0 zurück. Im obigen Programm überprüfe ich, ob res == 0, und wenn ja, dann verwende ich Python Scheduler, um das Programm zu planen. Das Hauptproblem, mit dem ich derzeit konfrontiert bin, ist jedoch, dass die Prozess-ID dieses Programms und des run_constantly.py Programms gleich wird, sobald ich die run_constantly.py unter Verwendung der scheduler.add_cron_job() Funktion einplane. Also, wenn das Programm run_constantly.py abstürzt, das folgende Programm immer noch denkt, dass die run_constantly.py läuft (da beide Prozess-IDs gleich sind), und damit weiterhin in die else-Schleife zu schlafen gehen und wieder zu überwachen.

Kann mir jemand sagen, wie ich dieses Problem lösen kann? Gibt es eine einfache Möglichkeit, ein Programm ständig zu überwachen und es nach einem Absturz neu zu planen?

Antwort

6

Es gibt viele Programme, die dies tun können.

Auf Ubuntu es upstart ist (standardmäßig installiert)

Viele Leute wie http://supervisord.org/

monit wie @nathan erwähnt

Wenn Sie einen Python Alternative suchen gibt es eine Bibliothek, wurde gerade veröffentlicht circus, die interessant aussieht.

Und so ziemlich jede Linux-Distribution wahrscheinlich eine dieser eingebaut.

Die Wahl wirklich gerade nach unten ist, welches mögen Sie besser, aber Sie würden eine davon weit besser dran mit, als es selbst zu schreiben .

Hoffnung, die

+0

+1 auf Supervisord. Ich benutze es und es ist wirklich einfach und plattformübergreifend. – jdi

+0

@Mark Lakewood Danke, Monit scheint ziemlich interessant zu sein, obwohl es an einer korrekten Dokumentation fehlt. Es funktioniert ziemlich ordentlich – Rkz

1

Sie könnten nur monit http://mmonit.com/monit/

verwenden Sie überwacht Prozesse und startet sie (und andere Dinge.)

+0

monit kann viele nützliche denken. – crow16384

+0

Aber wie läuft Ihr Scheduler die Anwendung? Es ist nicht klar aus Ihrem Codebeispiel. Um Probleme mit PIDs zu lösen, haben Sie es im System korrekt ausgeführt. – crow16384

2

hilft, wenn Sie bereit sind, von Python direkt auf das überwachte Programm zu steuern, anstatt cron verwenden, haben einen Blick auf die subprocess module:

The subprocess module allows you to spawn new processes, 
connect to their input/output/error pipes, and obtain their return codes. 

prüfen Beispiele wie track process status with python auf SO für Beispiele und Referenzen.