système de redémarrage automatique en Python
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à.
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 ne l'ai pas essayé moi-même, mais il est le module d'un Python Informations sur le système peut être utilisé pour trouver des processus et obtenir des informations à leur sujet. AFAIR il y a une classe ProcessTable
qui peut être utilisé pour inspecter les processus en cours, mais il ne semble pas être très bien documenté ...
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.