Monitorar constantemente um programa / processo usando Python

Estou tentando monitorar constantemente um processo que é basicamente um programa Python. Se o programa parar, então eu tenho que iniciar o programa novamente. Estou a usar outro programa Python para o fazer.

Por exemplo, digamos que tenho de executar constantemente um processo chamado run_constantly.py. Inicialmente executei este programa manualmente, que escreve o seu ID de processo para o ficheiro "PID" (no location out/PROCESSID/PID).

Agora eu dirijo outro programa que tem o seguindo o código para monitorar o programa run_constantly.py de um ambiente Linux:

def Monitor_Periodic_Process():

    TIMER_RUNIN = 1800
    foo = imp.load_source("Run_Module","run_constantly.py")
    PROGRAM_TO_MONITOR = ['run_constantly.py','out/PROCESSID/PID']
    while(1):
        # call the function checkPID to see if the program is running or not
        res = checkPID(PROGRAM_TO_MONITOR)
        # if res is 0 then program is not running so schedule it
        if (res == 0):
            date_time = datetime.now()
            scheduler.add_cron_job(foo.Run_Module, year=date_time.year, day=date_time.day, month=date_time.month, hour=date_time.hour, minute=date_time.minute+2)
            scheduler.start()
            scheduler.get_jobs()
            time.sleep(TIMER_NOT_RUNIN)
            continue
        else:
            #the process is running sleep and then monitor again
            time.sleep(TIMER_RUNIN)
            continue

não incluí aqui a função checkPID(). checkPID() verifica basicamente se o ID do processo ainda existe (ou seja, se o programa ainda está em execução) e se não existe, devolve 0. No programa acima, eu verifico se res == 0, e se sim, então eu uso o scheduler do Python para agendar o programa. No entanto, o maior problema que estou enfrentando atualmente é que o ID do processo deste programa e do programa run_constantly.py se torna o mesmo assim que agendar o run_constantly.py usando a função scheduler.add_cron_job(). Então, se o programa run_constantly.py falhar, o seguinte programa ainda pensa que o run_constantly.py está em execução (uma vez que ambos os IDs do processo são os mesmos), e, portanto, continua a entrar no loop para dormir e monitorar novamente.

Alguém me pode dizer como resolver este problema? Existe uma maneira simples de monitorar constantemente um programa e remarcar quando ele se despenhou?

Author: alex, 2012-11-28

3 answers

Existem muitos programas que podem fazer isso.

No Ubuntu existe upstart (instalado por omissão)

Muitas pessoas gostam de http://supervisord.org/

Monit Como mencionado por @nathan

Se você está procurando por uma alternativa python há uma biblioteca que acabou de ser lançada chamada circus o que parece interessante.

E praticamente todas as distribuições linux provavelmente têm um destes incorporado.

A escolha na verdade, depende de qual gostas mais, mas estarias muito melhor a usar um destes do que a escrevê-lo tu mesmo.

Espero que isso ajude.
 6
Author: Mark Lakewood, 2012-11-28 05:58:59

Se estiver disposto a controlar o programa monitorizado directamente a partir do python em vez de usar o cron, dê uma vista de olhos no subprocesso Módulo :

The subprocess module allows you to spawn new processes,
connect to their input/output/error pipes, and obtain their return codes.

Verifique exemplos como acompanhar o estado do processo com o python assim por exemplo e referências.

 2
Author: gimel, 2017-05-23 12:08:57

Podes usar o monit http://mmonit.com/monit/

Monitoriza os processos e reinicializa-os (e outras coisas.)

 1
Author: nathan, 2012-11-28 05:41:16