Desativar cron emails, a menos que haja erros?

12

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".

Warren
fonte
E se o crond em si não estiver funcionando? Ou a máquina está offline? É por isso que nunca me incomodo com os emails do cron e uso um serviço de monitoramento cron dedicado. Sou parcial no WDT.io e recomendo.
Christian Pekeler

Respostas:

8

Como você não está cuidando da saída, pode redirecionar o STDOUT de um trabalho para /dev/nulle permitir que o STDERR seja enviado via correio (usando MAILTOa variável de ambiente).

Então, por exemplo:

...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null

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 crontrabalho.

heemail
fonte
1
A desvantagem dessa abordagem é que, quando ela falha, você obtém apenas a saída STDERR, o que pode dificultar o diagnóstico do que se você tivesse a saída completa.
plugwash
10

O chroniccomando do moreutils executa um comando silenciosamente, a menos que falhe.

Citando seu manual:

chronic executa um comando e organiza a saída padrão e o erro padrão a serem exibidos apenas se o comando falhar (sai diferente de zero ou trava). Se o comando for bem-sucedido, qualquer saída estranha será ocultada.

Um uso comum para crônico é executar um trabalho cron. Em vez de tentar manter o comando silencioso, e ter que lidar com mensagens que contêm saída acidental quando for bem-sucedida e não apresentar saída suficiente quando falhar, você pode executá-lo sempre verbalmente sempre e usar chronic para ocultar a saída bem-sucedida.

Michał Politowski
fonte
8

Como só posso receber e-mails do cron se houver erros?

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 simplesmente cronic, desde que o seu PATHesteja 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:

Ossifragem Cósmica
fonte
1
Está cronicrelacionado chronicou é apenas coincidência?
Toby Speight
@TobySpeight Coincidência parece. cronicé implementado no bash, chronicconforme sugerido na resposta anterior é um script Perl.
Cosmic ossifrage
4

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>&1que redireciona STDERR para STDOUT.

Envie a saída inteira via configuração padrão do cron mailer:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

O mesmo, mas com um endereço e assunto específicos:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]

Você pode até executar várias ações por erro e adicionar ao email:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

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.

Akom
fonte
Você deve colocar $OUTPUTentre aspas: "$OUTPUT".
G-Man Diz 'Reinstate Monica'
@ Ponto justo do G-Man, sempre há uma chance de que a saída contenha "-n" ou algo semelhante.
Akom
0

Provavelmente não pensei nisso o tempo todo, mas

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

, em casos comuns, redirecionaria tudo para um arquivo temporário (você provavelmente desejaria usar mktemppara obter um nome de arquivo exclusivo), excluiria se o arquivo foi bem-sucedido e, em seguida, cato 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.)

Ulrich Schwarz
fonte