Como posso ignorar falhas transitórias em scripts executados pelo cron?

2

Eu tenho vários scripts de estilo de backup que são executados a partir do cron em um servidor sem cabeçalho (Ubuntu 14.04), normalmente em uma programação diária. O Cron é configurado com um servidor de e-mail para que eu receba feedback dos trabalhos. Normalmente, esses scripts de backup são gravados para serem executados sem qualquer resultado de stdout / stderr (seguindo o paradigma padrão do Unix de que "nenhuma notícia é boa"), para que não entupam minha caixa de entrada de e-mails.

Ocasionalmente, estas falhas, e eu vou receber um email imediatamente com a saída stdout / stderr. No entanto, muitas vezes essas falhas são por razões conhecidas e, em particular, são transitórias (por exemplo, elas provavelmente desaparecerão novamente no dia seguinte). Por exemplo, minha conexão com a Internet é um pouco não confiável e, ocasionalmente, as resoluções remotas do DNS falharão (suponha que isso não possa ser corrigido para os propósitos desta pergunta). Claro, isso não pode ser previsto com antecedência, portanto, reduzir a frequência do trabalho não funciona.

O que eu acho que gostaria que o cron informasse de mim depois que um determinado trabalho falhou por mais de n tentativas, ou após um certo período de tempo, então eu só posso relatórios de erros 'permanentes' que eu preciso abordar. Isso é possível?

Estou usando o cron 3.0pl1-124ubuntu2 no Ubuntu 14.04, embora esteja aberto a outros softwares do tipo cron e uma resposta mais geral (por exemplo, um wrapper que eu possa colocar em volta dos meus scripts) seria muito útil para os outros, tenho certeza.

Opções que considerei:

  • Incorpore a lógica no próprio script para lidar com isso - uma opção, mas eu estava procurando um lugar um pouco mais genérico - alguns scripts são bash, alguns python, etc. Além disso, isso iria complicar significativamente as coisas, como todos stdout / stderr o script, então, gostaria de ter uma função de wrapper.
  • Use um servidor de Integração Contínua como Jenkins para administrar meus trabalhos - mais poderoso, provavelmente fornece o que estou procurando com vários plugins, mas significativamente mais complexo para gerenciar, um pouco pesado (requer uma JVM), e não muito Unix-y.
  • noexcuses - Um pouco agressivo demais, já que tentaria backups remotos, etc., o que comprometerá recursos e causará DoSes acidentais. Prefiro que o cron job tenha sido repetido em sua programação original.
por Andrew Ferrier 07.10.2015 / 12:45

2 respostas

0

Eu comecei agora a escrever um utilitário wrapper para resolver o meu próprio problema aqui, chamado cromer . Agora está trabalhando de forma básica. Quaisquer contribuições / solicitações / questões etc. são bem-vindas.

    
por 10.11.2015 / 08:56
2

Como você deseja rastrear falhas ao longo de muitos dias, você essencialmente precisa registrar os problemas, no entanto, esses "logs" não precisam ser relacionados a você e podem ser guardados apenas para o cronjob. Um wrapper em torno de seus scripts parece ser o caminho a percorrer.

maxAttempts=5

if [ -f ~/.script_fails ];then #determine the number of failures
    failures=$(cat ~/.script_fails)
else
    failures=0
fi

if [ $failures -lt $maxAttempts ];then #determine if failures exceeds max attempts
    ./script.sh > /dev/null #if so, get rid of output
else
    ./script.sh #otherwise keep it
fi

result=$?

if [ $result -eq 0 ];then #increment or remove counter
    rm ~/.script_fails
else
    failures=$failures + 1
    echo $failures > ~/.script_fails
fi

isso determina quando o registro precisa ser mantido ou ignorado, de forma direta. O arquivo para rastreamento de contagens de falhas está oculto em seu diretório pessoal, portanto, você poderá verificá-lo se quiser, mas seu e-mail não deverá ver nada, a menos que as falhas fiquem muito altas.

No entanto, eu recomendaria usar o jenkins, isso facilita muito a vida quando configurado.

    
por 07.10.2015 / 14:34