Basear-se muito nas capacidades de envio de mensagens da crond pode gerar vários problemas. Dependendo da sua crona, eles talvez não sejam flexíveis o suficiente.
Por exemplo, muitas vezes, como você descreveu, não é possível configurar que apenas um status de saída! = 0 deve acionar a correspondência de stdout / stderr. Outra questão é que, por exemplo, o Solaris crond tem um limite de tamanho (relativamente) pequeno na saída que captura / mails.
Assim, para tais situações, sugiro escrever um pequeno script auxiliar que chame os comandos e redirecione a saída para um arquivo de log temporário. Ele pode acompanhar internamente o status de saída de todos os programas e, se um deles for! = 0:
- gere o arquivo de log para stdout
- envie-o por meio de uma ferramenta de correio da linha de comando
- ou apenas diagnósticos curtos de saída que incluem o local do arquivo de log
Algo como:
$ cat helper.sh
set -u
set -e
# setup log-file $LOG
# ...
cd FQNameOfRepo
set +e
git pull 1>/dev/null 2>> $LOG
r1=$?
make doc-all 1>/dev/null 2>> $LOG
r2=$?
cp doc/latex/refman.pdf doc/html/ 2>> $LOG
r3=$?
set -e
if [ $r1 -ne 0 -o $r2 -ne 0 -o $r3 -ne 0 ]; then
# do some stuff, print/mail $LOG or something like that, etc.
# ...
exit 23
fi