sistema di auto-restart in Python
Domanda
ho bisogno di rilevare quando un programma si blocca o non è in esecuzione utilizzando Python e riavviarlo. Ho bisogno di un metodo che non necessariamente si basa sul modulo python è il processo padre.
sto valutando l'attuazione di un ciclo while che fa essenzialmente
ps -ef | grep process name
e quando il processo non viene trovato inizia un'altra. Forse questo non è il metodo più efficiente. Sono nuovo di python quindi forse c'è un modulo python che fa questo già.
Soluzione
Perché implementare da soli? Un programma di utilità esistenti come demone start-stop-daemon
di Debian o è più probabile ottenere le altre cose difficili diritto di rimanere a corto di server a lungo vivente processi.
In ogni caso, quando si avvia il servizio, messo il suo pid in /var/run/<name>.pid
e poi fare il vostro comando ps
basta guardare per tale ID di processo, e controllare che sia il giusto processo. Su Linux si può semplicemente guardare /proc/<pid>/exe
per verificare che punti al file eseguibile destra.
Altri suggerimenti
Si prega di non reinventare init. Il sistema operativo ha capacità per fare questo che richiedono quasi nessun risorse di sistema e sarà sicuramente farlo meglio e più affidabile di qualsiasi cosa è possibile riprodurre.
Classic Linux ha / etc / inittab
Ubuntu ha /etc/event.d (upstart)
OS X è launchd
Solaris è SMF
Il codice seguente controlla un determinato processo in un dato intervallo, e riavvia.
#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()
Non ho provato io stesso, ma c'è un modulo Python Sistema Informativo che può essere utilizzato per trovare i processi e ottenere informazioni su di loro. AFAIR c'è una classe ProcessTable
che può essere utilizzato per controllare i processi in esecuzione, ma non sembra essere molto ben documentato ...
mi piacerebbe andare via riga di comando (è solo IMHO più facile) fino a quando si controlla solo ogni secondo o due l'utilizzo delle risorse dovrebbe essere infinitesimo rispetto al trattamento disponibile su qualsiasi sistema di meno di 10 anni.