O trabalho do Crontab não está enviando um email por falha

5

Eu tenho um cron job no Debian:

1 * * * * /home/paradroid/bin/myscript.sh >/dev/null

Existe um MTA instalado e configurado, e recebi e-mails quando o script tem um erro de sintaxe, por isso sempre pensei que seria informado quando algo desse errado.

O script faz o download de um arquivo usando curl por meio de um proxy. Recentemente, o proxy falhou, então curl não pôde fazer o download. É o último comando no script, que saiu com o código de erro 7.

Eu achava que receberia e-mails quando isso acontecesse, mas não o fiz.

Por que recebo alertas de e-mail de algo como erros de sintaxe no script, mas não os obtive quando o script falha em fazer seu trabalho e sai com um código de erro?

Há algo errado ou preciso fazer com que o script me envie um e-mail diretamente quando houver um erro com curl ?

    
por paradroid 01.01.2012 / 22:20

3 respostas

3

Depois de conversar com algumas pessoas sobre #curl no Freenode, um dev mencionou que houve um bug em curl por cerca de uma década (antes de 7.23.0) onde um erro de análise de opção tratou -Ss ( --show-silent --show-error ) como -s ( --silent ), então todas as saídas são suprimidas, incluindo stdout .

A solução (antes de 7.23.0) é usar -sS ou opções longas.

Esse erro desagradável me causou muita confusão e deixou um cron job importante falhar sem que eu soubesse por vários dias!

    
por 03.01.2012 / 05:08
5

Estou assumindo que suas configurações de e-mail do cron estão corretas e você recebe e-mails.

O envio de todos os stdout para /dev/null , portanto, qualquer coisa que imprima mensagens de erro deve gerá-las para stderr. Você pode querer ter certeza de que tudo no script esteja saindo corretamente.

Às vezes eu tive que trabalhar com código de terceiros, que estava enviando tudo para o stdout. Nesses casos, costumo interromper uma verificação de erros. Não é bonito, mas nem a maioria dos scripts de shell.

    
por 01.01.2012 / 22:45
1

O Cron apenas envia um e-mail para os streams de saída stdout e stderr se a saída contiver.

Você pode acionar o cron para notificá-lo fazendo um eco condicional no código de retorno do programa. Isso pressupõe que o programa defina um status de falha apropriadamente. Isso pode ser feito colocando || echo Failure status $? no final da linha de comando. Sintonize a mensagem ao seu gosto. Os formulários longos devem envolver o comando com uma construção if then fi ou testar o código de retorno após o comando ser executado.

    
por 02.01.2012 / 03:16