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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top