Ausgaben von cron-Jobs per Mail versenden

Datum: 2004-01-26
Quelle: debian-user-german

Worum ging es?

Auf vielen Server-Systemen laufen jede Menge cron-Jobs zur Erledigung der periodischen Arbeiten. Nun ist es so, dass alles, was per stdout oder stderr von den aufgerufenen Programmen ausgegeben wird, mangels Terminal per Mail an den Benutzer geschickt wird. Diese Meldungen sind oft hilfreich, wenn der Grund für einen Fehler gesucht wird, können aber ziemlich lästig werden, wenn der Job eigentlich sauber abgelaufen ist und nur einige beteiligte Programme zu redselig sind. Es gibt wie immer mehrere Möglichkeiten zur Abhilfe:

  • Alle Ausgaben werden nach /dev/null umgeleitet, das Programm sorgt selbst für eine Mail bei einem Fehler
  • Im Script werden die Ausgaben aller Programme abgefangen und gezielt nur die durchgelassen, die in einer Mail auftauchen sollen
  • Die Ausgaben des Scripts werden in einer Log-Datei gesammelt und diese wird nur bei einem Fehler (Returncode ungleich 0) ausgegeben

Ich habe in diesem Fall die letzte Variante vorgeschlagen. Der Eintrag in die crontab-Datei kann beispielhaft wie folgt aussehen (in einer Zeile zu schreiben):

Code
*/5 * * * * root LOG=/tmp/script$$.log; /path/to/script >$LOG \
    2>&1 || /bin/cat $LOG; /bin/rm $LOG
Beschreibung

Zuerst wird eine Protokolldatei definiert, die die Prozess-ID des Jobs beinhaltet (damit sich parallel laufende Instanzen nicht ins Gehege kommen). Beide Ausgabekanäle des Scripts werden in die Datei umgelenkt (will man nur stderr haben, wird einfach stdout ins Nirvana geschickt). Wenn das Script mit einem Returncode ungleich 0 beendet wird, wird die Protokolldatei ausgegeben. Anschließend wird sie gelöscht.

Noch eine Anmerkung: die o. g. Syntax gilt für die nur unter Linux existierende Datei /etc/crontab, will man die benutzerspezifischen crontabs nutzen, entfällt die Angabe des Benutzers im 6. Feld ("root").