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à.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top