Cronjob stderr para arquivar e enviar e-mail

7

Eu preciso que meus cronjobs continuem a gerar erros em alguns arquivos, mas também quero que eles sejam enviados por e-mail ao mesmo tempo. Isso não parece ser possível sem alguns truques.

Eu encontrei isso mas não me ajudou .

Qual seria a maneira mais simples de fazer isso?

    
por Bastien974 27.05.2011 / 21:52

3 respostas

8

Se eu entendi sua pergunta corretamente, você quer enviar os erros (não saída) para um arquivo de log, e também enviá-los via e-mail.

Para fazer isso, use uma combinação de tee e redirecionamento stdout / stderr.

De acordo com a página de manual do cron (8) , o cron pode manipular o email para você. Não há necessidade de duplicar esse esforço desnecessariamente.

When executing commands, any output is mailed to the owner of the crontab (or to the user named in the MAILTO environment variable in the crontab, if such exists).

O truque aqui é enviar STDERR para um arquivo de log e para o email, mas não para STDOUT. O exemplo a seguir ilustra como fazer isso.

Suponha que meu script execute o seguinte comando. ls tmp/foo é bem sucedido, então esta saída vai para STDOUT. ls tmp/bar gera um erro, então esta saída é enviada para STDERR.

$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo

O cronjob a seguir ocultará qualquer STDOUT, mas redirecionará STDERR para /var/log/test.log

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log

Aqui estão os resultados. O email e ~ / var / log / test.log vão dizer a mesma coisa.

O corpo do email diz:

ls: tmp/bar: No such file or directory

O arquivo de log diz a mesma coisa:

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory

Como um bônus adicional, também é possível enviar STDERR & STDOUT para um arquivo de log (que você olha apenas ocasionalmente), mas envia STDERR para a tela (se executado manualmente) ou e-mail (se executado a partir do cron). Eu uso o seguinte snippit para scripts de construção de longa duração.

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE
    
por 27.05.2011 / 23:17
2

Use tee :

MBPro-ABustardo:~ abustardo$ echo foo |tee tmp  
foo

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

no seu caso:

[your script] 2>&1 |tee [some local local file] |mail -s [subject] [email protected]
    
por 27.05.2011 / 23:08
0

Isso responde à sua pergunta? link

O Cron deve enviar um e-mail após cada execução, a menos que seja direcionado para /dev/null

    
por 27.05.2011 / 22:43