Monitorar constantemente um programa / processo usando Python
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.
3 answers
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.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.
Podes usar o monit http://mmonit.com/monit/
Monitoriza os processos e reinicializa-os (e outras coisas.)