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