cron
sendet bereits die Standardausgabe und den Standardfehler jedes ausgeführten Jobs per E-Mail an den Eigentümer des Cron-Jobs.
Sie können MAILTO=recipient
in der crontab
Datei verwenden, um die E-Mails an ein anderes Konto zu senden.
Damit dies funktioniert, muss die E-Mail ordnungsgemäß funktionieren. Die Zustellung an eine lokale Mailbox ist normalerweise kein Problem (tatsächlich ls -l "$MAIL"
wird sich wahrscheinlich herausstellen, dass Sie bereits welche erhalten haben), aber für die Zustellung aus der Box ins Internet ist der MTA (Postfix, Sendmail, was haben Sie) erforderlich richtig konfiguriert sein, um eine Verbindung zur Welt herzustellen.
Wenn keine Ausgabe erfolgt, wird keine E-Mail generiert.
Eine übliche Anordnung besteht darin, die Ausgabe in eine Datei umzuleiten. In diesem Fall sieht der Cron-Daemon natürlich nicht, dass der Job eine Ausgabe zurückgibt. Eine Variante besteht darin, die Standardausgabe in eine Datei umzuleiten (oder das Skript so zu schreiben, dass es nie etwas druckt - vielleicht speichert es stattdessen Ergebnisse in einer Datenbank oder führt Wartungsaufgaben aus, die einfach nichts ausgeben?) Und nur dann eine E-Mail zu erhalten, wenn es vorhanden ist ist eine Fehlermeldung.
Um beide Ausgabestreams umzuleiten, lautet die Syntax
42 17 * * * script >>stdout.log 2>>stderr.log
Beachten Sie, wie wir (doppelt >>
) anhängen anstatt zu überschreiben, damit die Ausgabe eines vorherigen Jobs nicht durch die Ausgabe des nächsten ersetzt wird.
Wie in vielen Antworten hier vorgeschlagen, können beide Ausgabestreams an eine einzelne Datei gesendet werden. Ersetzen Sie die zweite Umleitung durch 2>&1
"Standardfehler sollten überall dort auftreten, wo die Standardausgabe ausgeführt wird". (Aber ich unterstütze diese Vorgehensweise nicht besonders. Es ist vor allem dann sinnvoll, wenn Sie bei der Standardausgabe nicht wirklich etwas erwarten, aber möglicherweise etwas übersehen haben, das möglicherweise von einem externen Tool stammt, das von Ihrem Skript aufgerufen wird.)
cron
Jobs werden in Ihrem Home-Verzeichnis ausgeführt, daher sollten alle relativen Dateinamen relativ dazu sein. Wenn Sie außerhalb Ihres Home-Verzeichnisses schreiben möchten, müssen Sie natürlich separat sicherstellen, dass Sie Schreibzugriff auf diese Zieldatei haben.
Ein häufiges Antipattern besteht darin, alles umzuleiten /dev/null
(und dann Stack Overflow zu bitten, um herauszufinden, was schief gelaufen ist, wenn etwas nicht funktioniert; aber wir können die verlorene Ausgabe auch nicht sehen!).
Stellen Sie in Ihrem Skript sicher, dass die regelmäßige Ausgabe (tatsächliche Ergebnisse, idealerweise in maschinenlesbarer Form) und die Diagnose (normalerweise für einen menschlichen Leser formatiert) getrennt sind. In einem Shell-Skript
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Auf einigen Plattformen (und z. B. GNU Awk) können Sie den Dateinamen /dev/stderr
für Fehlermeldungen verwenden, dies ist jedoch nicht ordnungsgemäß portierbar. in Perl warn
und die
nach Standardfehler drucken; in Python schreiben sys.stderr
oder verwenden logging
; Versuchen Sie es in Ruby $stderr.puts
. Beachten Sie auch, wie Fehlermeldungen den Namen des Skripts enthalten sollten, das die Diagnosemeldung erstellt hat.