Como só posso receber e-mails do cron se houver erros?
Na esmagadora maioria dos casos, as tarefas serão executadas muito bem - e eu realmente não me importo com o resultado.
É apenas no caso raro de uma falha que eu quero / preciso saber.
Tenho o procmail disponível - mas não tenho certeza se o que estou descrevendo é possível gerenciar externamente para o cron "corretamente".
cron
email
error-handling
Warren
fonte
fonte
Respostas:
Como você não está cuidando da saída, pode redirecionar o STDOUT de um trabalho para
/dev/null
e permitir que o STDERR seja enviado via correio (usandoMAILTO
a variável de ambiente).Então, por exemplo:
enviará correio quando houver saída apenas no STDERR (com o STDERR) e descartará o STDOUT.
Obviamente, isso pressupõe que, quando um programa foi escrito em STDERR, falhou; isso pode não ser sempre o caso. Se você tiver controle sobre o programa, poderá fazê-lo. Para qualquer caso complexo, você deve escrever um wrapper de algum tipo que execute o (s) comando (s) e enviar e-mail de acordo. E coloque o invólucro como o
cron
trabalho.fonte
O
chronic
comando do moreutils executa um comando silenciosamente, a menos que falhe.Citando seu manual:
fonte
Você pode agrupar suas chamadas cron com cronic , um script de shell que consome a saída cron, a menos que o código de retorno do processo chamado seja diferente de zero ou que exista um erro de rastreio.
Para usar o cronic, faça o download do script para um local adequado, como
/usr/local/bin
. Suas entradas do crontab devem ser prefixadas com o caminho para o script (por exemplo/usr/local/bin/cronic
), ou simplesmentecronic
, desde que o seuPATH
esteja definido corretamente.Observe que "erros" é um termo mal definido na sua pergunta e requer uma definição cuidadosa. Para que o cronic seja útil, você deve garantir que os trabalhos agrupados com erros de relatório cronic sejam executados de uma das maneiras que define uma condição de erro. Métodos implícitos de relatório, como escrever cadeias de texto
STDOUT
, exigirão uma reflexão mais aprofundada para torná-lo compatível com o mecanismo de relatório cronic ou outro cron.Outros wrappers estão disponíveis, conforme vinculado no site cronic:
fonte
cronic
relacionadochronic
ou é apenas coincidência?cronic
é implementado no bash,chronic
conforme sugerido na resposta anterior é um script Perl.Aqui está outra variação que utilizei com sucesso por muitos anos - capture a saída e imprima apenas com erro . Isso não requer arquivos temporários e preserva toda a saída . A parte importante é a
2>&1
que redireciona STDERR para STDOUT.Envie a saída inteira via configuração padrão do cron mailer:
O mesmo, mas com um endereço e assunto específicos:
Você pode até executar várias ações por erro e adicionar ao email:
Isso funcionará para comandos simples. Se você está lidando com pipes complexos (
find / -type f | grep -v bla | tar something-or-other
), é melhor mover o comando para um script e executá-lo usando a abordagem mencionada acima. O motivo é que, se alguma parte do tubo for enviada para STDERR, você ainda receberá e-mails.fonte
$OUTPUT
entre aspas:"$OUTPUT"
.Provavelmente não pensei nisso o tempo todo, mas
, em casos comuns, redirecionaria tudo para um arquivo temporário (você provavelmente desejaria usar
mktemp
para obter um nome de arquivo exclusivo), excluiria se o arquivo foi bem-sucedido e, em seguida,cat
o conteúdo novamente, se eles ainda existirem (por exemplo, yourthing.sh saiu com condição de erro), a ser atendido pelo cron mailer.Se a memória servir, o cron já não envia nada se não houver saída; portanto, se o arquivo de log estiver vazio ou não existir, nada acontecerá. (Nós redirecionamos a mensagem de erro.)
fonte