Serviço para reiniciar (com segurança, se isso falhar, com força) alguns processos diferentes em um planejamento

0

Atualmente, estou executando um projeto pessoal que basicamente monitora algumas coisas ao redor do relógio. Um é um processo que usa o PhantomJS, e o outro verifica algumas outras APIs e envia e-mails se ocorrer alguma situação específica.

Quando tudo está em funcionamento, ele funciona exatamente como eu quero, mas infelizmente, no momento, a cada 2-3 dias, algo ocorre normalmente na calada da noite, e o scanner da API apenas congela. Ele está escrito em Python e é executado a cada 3 segundos, e quando eu verifico o log no dia seguinte, não há falhas, nada parece fora do normal, mas, por algum motivo, ele parou de funcionar.

Quando tiver tempo, acabarei por consertar isso, mas porque isso só ocorre uma vez após 3 ou 4 dias consecutivos, tem sido muito difícil de reproduzir.

Para as coisas do PhantomJS ... de vez em quando, isso explode. Novamente, haverá limpeza acontecendo, corrigindo esses problemas e, potencialmente, substituindo-os completamente.

Mas, enquanto isso, o que eu gostaria de fazer é reiniciá-los a cada 24 horas por dia. Definitivamente não é de forma alguma perfeita, mas pelo que estou fazendo atualmente, isso resolveria 99% dos meus problemas.

Em um mundo perfeito, eu teria uma lista de processos, emparelhados com uma lista de PIDs. Uma vez a cada 24 horas, em um momento que eu proscrevi, eu quero que este controlador percorra cada um dos PIDs, envie um sinal de kill regular (um deles fala com um DB, então eu gostaria que ele fechasse com segurança, se possível), espere um período de tempo proscrito (digamos, 30 segundos), depois envie um sinal sudo kill -9 para o PID para situações de acidentes fatais, depois execute o comando de inicialização novamente.

Eu olhei para talvez usando Supervisor para isso, mas não parecia (a princípio desmascarado) fazer o que estou procurando.

Eu estou completamente bem com talvez usar 2-3 programas diferentes para isso (cron + script + supervisord + python, por exemplo), em vez de procurar por um, se não houver a solução única perfeita.

    
por seaders 06.07.2015 / 14:06

1 resposta

1

Minha solução preferida é um script python orientado por cron que cuida principalmente de iniciar os processos monitorados quando eles não estão em execução. Ele próprio pode obter e armazenar os PIDs de processos filho (e talvez outros metadados, se necessário, por exemplo, um último registro de data e hora da iteração OK) para uso posterior ou apenas monitorar os arquivos criados pelos próprios processos filhos.

Na primeira iteração, aproveito os padrões / cronogramas de falhas relativamente previsíveis e modifico os respectivos processos-filhos para simplesmente sair de forma limpa após um número especificado de iterações ou tempo total de execução. O processo de monitoramento seria apenas reiniciá-los.

No caminho, o script de monitoramento pode ser aprimorado para fazer uma análise de sanidade mais detalhada dos processos monitorados em execução e eliminá-los, se necessário. Por exemplo, verificando o último registro de data e hora da iteração OK que eu mencionei acima. Isso cuidaria de padrões de falha menos preditivos.

Para a execução real de estruturas de processo mais complexas, convém verificar minha resposta a essa pergunta: link .

    
por 06.07.2015 / 14:44