Question

Je dois détecter quand un programme se bloque ou ne sont pas en cours d'exécution en utilisant Python et redémarrez-le. Je besoin d'une méthode qui ne repose pas nécessairement sur le module python étant le processus parent.

J'envisage la mise en œuvre d'une boucle while qui fait essentiellement

ps -ef | grep process name

et quand le processus ne se trouve pas, il commence une autre. Peut-être que ce n'est pas la méthode la plus efficace. Je suis nouveau python donc peut-être il y a un module python qui le fait déjà.

Était-ce utile?

La solution

Pourquoi mettre en œuvre vous-même? Un utilitaire existant comme démon ou la start-stop-daemon de Debian est plus susceptible d'obtenir les autres choses difficiles à droite sur l'exécution serveur de longue vie processus.

Quoi qu'il en soit, lorsque vous démarrez le service, mettre son pid dans /var/run/<name>.pid puis faites votre commande ps il suffit de regarder pour cet ID de processus, et vérifier qu'il est le bon processus. Sur Linux, vous pouvez simplement regarder /proc/<pid>/exe pour vérifier qu'il pointe vers l'exécutable droit.

Autres conseils

S'il vous plaît ne pas réinventer initialisation. Votre système d'exploitation a des capacités pour ce faire qui nécessitent presque pas de ressources système et va certainement le faire mieux et plus fiable que tout ce que vous pouvez reproduire.

Classique Linux a / etc / inittab

Ubuntu a /etc/event.d (parvenu)

OS X a Launchd

Solaris a smf

Le code suivant vérifie un procédé donné dans un intervalle donné, et le redémarre.

#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()

peut-être besoin http://supervisord.org

Je vais la route de ligne de commande (il est juste plus facile IMHO) aussi longtemps que vous ne cochez chaque seconde ou deux l'utilisation des ressources devrait être infiniment petit par rapport au traitement disponible sur tout système moins de 10 ans.

scroll top