2009-05-23 5 views
5

Je dois détecter quand un programme se bloque ou ne fonctionne pas en utilisant Python et le redémarrer. J'ai besoin d'une méthode qui ne repose pas nécessairement sur le module python étant le processus parent.Redémarrage automatique du système en Python

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 sur python, il y a peut-être un module python qui le fait déjà.

Répondre

5

Pourquoi l'implémenter vous-même? Un utilitaire existant tel que daemon ou le start-stop-daemon de Debian est plus susceptible d'avoir d'autres difficultés à exécuter des processus serveur de longue durée.

Quoi qu'il en soit, lorsque vous démarrez le service, mettez son pid dans /var/run/<name>.pid et ensuite exécutez votre commande ps recherchez simplement l'ID de ce processus et vérifiez que c'est le bon processus. Sur Linux, vous pouvez simplement regarder /proc/<pid>/exe pour vérifier qu'il pointe vers le bon exécutable.

+0

En raison de la nature unique de l'ensemble de programmes surveillé, ils ne peuvent pas être transformés en démons. Ainsi, les méthodes de surveillance classiques ne sont pas disponibles pour moi. En outre, j'ai besoin de certaines fonctionnalités que je me sentirais plus à l'aise de m'impliquer dans un module sympa plutôt que de me fier au code externe. Merci pour le conseil/proc/ Caedis

0

Je ne l'ai pas essayé moi-même, mais il existe un module Python System Information qui peut être utilisé pour trouver des processus et obtenir des informations à leur sujet. AFAIR il ya une classe ProcessTable qui peut être utilisée pour inspecter les processus en cours, mais elle ne semble pas être très bien documentée ...

+0

Merci! Je vais regarder ça. – Caedis

0

Je passerais par la ligne de commande (c'est plus simple) Tant que vous ne vérifiez que toutes les secondes ou deux, l'utilisation des ressources devrait être infinitésimale par rapport au traitement disponible sur tout système de moins de 10 ans.

+0

Je le ferai probablement, soit en analysant la commande ps, soit en cherchant le répertoire/proc. – Caedis

3

Veuillez ne pas réinventer init. Votre système d'exploitation a des capacités pour ce faire qui ne nécessitent quasiment aucune ressource système et le fera certainement mieux et plus sûrement que tout ce que vous pouvez reproduire.

classique Linux a/etc/inittab

Ubuntu a /etc/event.d (arriviste)

OS X a Launchd

Solaris a smf

+0

Encore une fois, la nature unique des processus que je surveille exige qu'ils soient traités différemment d'un simple démon. Je ne peux pas simplement redémarrer les processus, verrouiller la base de données, corrompre les données du client. Les données doivent être validées avant de redémarrer le processus serveur. J'ai donc besoin de coder ceci en python pour éviter les problèmes sérieux. – Caedis

+0

Vous voulez des redémarrages automatiques ou vous ne voulez pas. Si vous le faites, vous voulez que votre système d'exploitation le fasse via init, etc ...Si vous ne le faites pas, votre question et votre titre expriment le contraire de vos intentions. – Dustin

1

Le code suivant vérifie une processus 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() 
Questions connexes