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?
+1 auf Supervisord. Ich benutze es und es ist wirklich einfach und plattformübergreifend. – jdi
@Mark Lakewood Danke, Monit scheint ziemlich interessant zu sein, obwohl es an einer korrekten Dokumentation fehlt. Es funktioniert ziemlich ordentlich – Rkz