Si je comprends bien votre question, vous souhaitez envoyer les erreurs (et non la sortie) dans un fichier journal et les envoyer également par courrier électronique.
Pour ce faire, utilisez une combinaison de tee
et la redirection stdout/stderr.
Selon la cron(8) cron peut se charger de l'envoi du courrier électronique pour vous. Il n'est pas nécessaire de dupliquer cet effort inutilement.
Lors de l'exécution des commandes, toute sortie est envoyée au propriétaire de la crontab (ou à l'utilisateur nommé dans la variable d'environnement MAILTO de la crontab, si elle existe).
L'astuce consiste à envoyer STDERR à un fichier journal et au courrier électronique, mais pas STDOUT. L'exemple suivant montre comment procéder.
Supposons que mon script exécute la commande suivante. ls tmp/foo
est réussie, cette sortie est donc envoyée à STDOUT. ls tmp/bar
génère une erreur, de sorte que cette sortie est envoyée à STDERR.
$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo
Le job cron suivant cachera tout STDOUT, mais redirigera STDERR vers /var/log/test.log
* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log
Voici les résultats. L'email et ~/var/log/test.log diront tous deux la même chose.
Le corps de l'e-mail indique :
ls: tmp/bar: No such file or directory
Le fichier journal indique la même chose :
$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory
En prime, il est également possible d'envoyer STDERR et STDOUT dans un fichier journal (que vous ne consultez qu'occasionnellement), mais d'envoyer STDERR à l'écran (s'il est exécuté à la main) ou par courrier électronique (s'il est exécuté à partir d'un cron). J'utilise l'extrait suivant pour les scripts de construction de longue durée.
{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE