Wenn ich Ihre Frage richtig verstehe, möchten Sie die Fehler (nicht ausgegeben) an eine Protokolldatei senden und sie auch per E-Mail senden.
Verwenden Sie dazu eine Kombination aus tee
und stdout / stderr-Umleitung.
Laut der Cron (8) Manpage kann Cron die E-Mail für Sie bearbeiten. Sie müssen diesen Aufwand nicht unnötig duplizieren.
Bei der Ausführung von Befehlen wird jede Ausgabe an den Eigentümer der Crontab gesendet (oder an den Benutzer, der in der Umgebungsvariablen MAILTO in der Crontab angegeben ist, falls vorhanden).
Der Trick dabei ist, STDERR an eine Protokolldatei und per E-Mail zu senden, nicht jedoch an STDOUT. Das folgende Beispiel zeigt, wie das geht.
Angenommen, mein Skript führt den folgenden Befehl aus. ls tmp/foo
ist erfolgreich, daher geht diese Ausgabe an STDOUT. ls tmp/bar
generiert einen Fehler, daher wird diese Ausgabe an STDERR gesendet.
$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo
Der folgende Cronjob versteckt STDOUT, leitet STDERR jedoch an /var/log/test.log weiter
* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log
Hier sind die Ergebnisse. Die E-Mail und ~ / var / log / test.log sagen beide dasselbe.
Der E-Mail-Text sagt:
ls: tmp/bar: No such file or directory
Die Protokolldatei sagt dasselbe:
$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory
Als zusätzlichen Bonus ist es auch möglich, STDERR & STDOUT an eine Protokolldatei (die Sie nur gelegentlich ansehen) zu senden, aber STDERR an den Bildschirm (wenn von Hand ausgeführt) oder per E-Mail (wenn von cron ausgeführt) zu senden. Ich verwende das folgende Snippit für lang laufende Buildskripte.
{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE