sistema de auto-restart em Python
Pergunta
Eu preciso para detectar quando um programa trava ou não está em execução usando python e reiniciá-lo. Eu preciso de um método que não necessariamente dependem do módulo python sendo o processo pai.
Estou pensando em implementar um loop while que essencialmente faz
ps -ef | grep process name
e quando o processo não for encontrado ele começa outra. Talvez este não é o método mais eficiente. Eu sou novo para python, portanto, possivelmente há um módulo python que faz isso já.
Solução
Por que implementá-lo? Um utilitário existente como daemon ou start-stop-daemon
do Debian é mais provável conseguir o outro direito coisas difíceis sobre a execução de servidor longa vida processos.
De qualquer forma, quando você iniciar o serviço, colocar a sua pid em /var/run/<name>.pid
e, em seguida, fazer o seu comando ps
basta olhar para esse ID processo e verificar se é o processo de direita. No Linux, você pode simplesmente olhar para /proc/<pid>/exe
para verificar se ele aponta para o executável direita.
Outras dicas
Por favor, não reinventar o init. Seu sistema operacional tem capacidade de fazer isso, que exigem quase nenhum recursos do sistema e certamente fazê-lo melhor e mais confiável do que qualquer coisa que você pode reproduzir.
Clássico Linux tem / etc / inittab
O Ubuntu tem /etc/event.d (iniciante)
OS X tem launchd
Solaris tem SMF
O seguinte código verifica um determinado processo em um determinado intervalo, e reinicia-lo.
#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()
talvez você precisa http://supervisord.org
Eu não tentei me, mas não há módulo de um Python Sistema de Informação que pode ser usado para encontrar processos e obter informações sobre eles. AFAIR há uma classe ProcessTable
que pode ser usado para inspecionar os processos em execução, mas não parece ser muito bem documentado ...
Eu iria a rota de linha de comando (que é apenas imho mais fácil), enquanto você só verificar cada segundo ou dois o uso de recursos deve ser infinitesimal comparado ao tratamento disponível em qualquer sistema com menos de 10 anos de idade.