Cronjob stderr zu Datei und E-Mail

7

Ich brauche meine Cronjobs, um weiterhin Fehler in einigen Dateien auszugeben, aber ich möchte auch, dass sie gleichzeitig per E-Mail gesendet werden. Ohne einige Tricks scheint das nicht möglich zu sein.

Ich fand dies aber hat mir geholfen , nicht.

Was wäre der einfachste Weg, das zu tun?

Bastien974
quelle

Antworten:

8

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 teeund 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/fooist erfolgreich, daher geht diese Ausgabe an STDOUT. ls tmp/bargeneriert 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
Stefan Lasiewski
quelle
2

Verwendung tee:

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

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

in Ihrem Fall:

[your script] 2>&1 |tee [some local local file] |mail -s [subject] [email protected]
Aimon Bustardo
quelle