Cron: Só recebe erros nos emails?

36

Eu finalmente configurei um agendamento de backup realista em meus dados por meio de um shell script, que é manipulado pelo cron em intervalos apertados. Infelizmente, recebo e-mails vazios toda vez que o CRON é executado e não apenas quando as coisas dão errado.

É possível apenas fazer o CRON enviar e-mails quando algo dá errado, ex. meu TAR não executa como pretendido?

Veja como meu crontab está configurado no momento;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

Muito obrigado!

    
por Industrial 24.01.2011 / 10:40

5 respostas

48

Idealmente, você desejaria que seu script de backup não emitisse nada se tudo ocorresse como esperado e só gerasse saída quando algo desse errado. Em seguida, use a variável de ambiente MAILTO para enviar qualquer saída gerada pelo seu script para o seu endereço de e-mail.

[email protected]
0 */2 * * * /bin/backup.sh

Se o seu script normalmente produz saída, mas você não se importa com isso no cron, apenas envie para / dev / null e ele enviará um e-mail somente quando algo for escrito para stderr.

[email protected]
0 */2 * * * /bin/backup.sh > /dev/null
    
por 24.01.2011 / 10:53
21

Usar cronic script wrapper parece uma boa ideia; para usá-lo, você não precisa alterar seus scripts.

Em vez de:

 0 1 * * * backup >/dev/null 2>&1

faça:

 0 1 * * * cronic backup


Mais informações no link .

    
por 13.02.2012 / 22:43
4

Você está instruindo especificamente cron para sempre enviar e-mail, mesmo quando /bin/backup.sh (a propósito, deve estar em /usr/local/bin ) ser bem-sucedido. Apenas omita a parte | mail -s "Backup status" [email protected] e o email só será enviado quando houver saída. Você provavelmente pode (dependendo do seu cron ) definir explicitamente o endereço de e-mail para o envio de e-mail como uma atribuição no arquivo crontab.

Para detalhes, consulte

man 5 crontab
    
por 24.01.2011 / 10:49
3

Você deve direcionar o stderr anmd e não ambos stdout e stderr .

Use 1> /dev/null não 2>&1 e tudo ficará bem. Além disso, você pode precisar relatar o erro corretamente no script de backup.

    
por 24.01.2011 / 10:51
2

Aqui está outra variação que eu tenho utilizado com sucesso por muitos anos - capturar a saída e imprimi-la somente no erro . Isso não requer arquivos temporários e preserva toda a saída . A parte importante é o 2>&1 que redireciona STDERR para STDOUT.

Envie a saída inteira por meio da configuração padrão do programa de mensagens do cron:

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

O mesmo, mas com um endereço e um 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 com erro e adicionar ao e-mail:

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

Isso funcionará para comandos simples. Se você estiver lidando com pipes complexos ( find / -type f | grep -v bla | tar something-or-other ), é melhor mover o comando para um script e executar o script usando a abordagem mencionada anteriormente. A razão é que, se qualquer parte do pipe sair para o STDERR, você ainda receberá e-mails.

    
por 30.11.2018 / 14:19