Wie kann ich nur bei Fehlern E-Mails von cron erhalten?
In den allermeisten Fällen laufen die Aufgaben einwandfrei - und mir ist die Ausgabe wirklich egal.
Nur im seltenen Fall eines Fehlers möchte / muss ich es wissen.
Ich habe Procmail zur Verfügung - bin mir aber nicht sicher, ob es möglich ist, das, was ich beschreibe, extern zu verwalten, um Cron "korrekt".
cron
email
error-handling
Labyrinth
quelle
quelle
Antworten:
Da Sie sich nicht um die Ausgabe kümmern, können Sie das STDOUT eines Jobs an umleiten
/dev/null
und das STDERR per E-Mail senden lassen (mithilfe derMAILTO
Umgebungsvariablen).Also zum Beispiel:
sendet E-Mails, wenn nur STDERR (mit dem STDERR) ausgegeben wird, und verwirft das STDOUT.
Dies setzt natürlich voraus, dass, wenn ein Programm auf STDERR geschrieben hat, dies fehlgeschlagen ist; Dies ist möglicherweise nicht immer der Fall. Wenn Sie die Kontrolle über das Programm haben, können Sie dies veranlassen. Für jeden komplexen Fall sollten Sie einen Wrapper schreiben, der die Befehle ausführt, und E-Mails entsprechend senden. Und legen Sie die Verpackung als
cron
Job.quelle
Der
chronic
Befehl von moreutils führt einen Befehl im Hintergrund aus, sofern er nicht fehlschlägt.Zitat aus seinem Handbuch:
quelle
Sie können Ihre cron- Aufrufe mit cronic umschließen , einem Shell-Skript, das die cron-Ausgabe verarbeitet, es sei denn, der Rückgabecode des aufgerufenen Prozesses ist ungleich Null oder es liegt eine Ausgabe ohne Trace-Fehler vor.
Um cronic zu verwenden, laden Sie das Skript an einen geeigneten Speicherort herunter, z
/usr/local/bin
. Ihren crontab-Einträgen muss der Pfad zum Skript vorangestellt werden (z. B./usr/local/bin/cronic
) oder nurcronic
, sofern SiePATH
richtig eingestellt sind.Beachten Sie, dass "Fehler" in Ihrer Frage ein schlecht definierter Begriff ist und eine sorgfältige Definition erfordert. Damit cronic nützlich ist, müssen Sie sicherstellen, dass die Jobs, die Sie mit cronic-Berichtsfehlern umbrechen, auf eine der Arten eine Fehlerbedingung definieren. Implizite Methoden zur Berichterstellung, wie das Schreiben von Textzeichenfolgen
STDOUT
, erfordern weitere Überlegungen, um dies mit cronic oder einem anderen cron-Berichtsmechanismus kompatibel zu machen.Andere Wrapper sind verfügbar, wie von der cronic-Site verlinkt:
quelle
cronic
Beziehungchronic
oder ist das nur Zufall?cronic
wird in bash implementiert,chronic
wie in der vorherigen Antwort vorgeschlagen, ist ein Perl-Skript.Hier ist eine weitere Variante, die ich seit vielen Jahren erfolgreich verwende - erfassen Sie die Ausgabe und drucken Sie sie nur bei Fehlern aus . Dies erfordert keine temporären Dateien und behält die gesamte Ausgabe bei . Der wichtige Teil ist der
2>&1
, der STDERR zu STDOUT umleitet.Senden Sie die gesamte Ausgabe über die Standard-Cron-Mailer-Konfiguration:
Gleich, aber mit einer bestimmten Adresse und Betreff:
Sie können sogar mehrere Aktionen bei Fehlern ausführen und der E-Mail hinzufügen:
Dies funktioniert für einfache Befehle. Wenn Sie es mit komplexen Pipes (
find / -type f | grep -v bla | tar something-or-other
) zu tun haben, sollten Sie den Befehl in ein Skript verschieben und das Skript mit dem oben beschriebenen Ansatz ausführen. Der Grund ist, dass Sie immer noch E-Mails erhalten, wenn ein Teil der Pipe an STDERR ausgegeben wird.quelle
$OUTPUT
in Anführungszeichen:"$OUTPUT"
.Ich habe das wahrscheinlich noch nicht durchgedacht, aber
Im Normalfall würden Sie alles in eine temporäre Datei umleiten (mit der Sie wahrscheinlich
mktemp
einen eindeutigen Dateinamen erhalten möchten ), löschen, wenn die Datei erfolgreich war, undcat
den Inhalt erneut, wenn er noch vorhanden ist (dh yourthing.sh wird beendet) mit Fehlerbedingung), vom Cron-Mailer abzuholen.Wenn der Speicher belegt ist, sendet cron bereits nichts, wenn keine Ausgabe erfolgt ist. Wenn die Protokolldatei leer ist oder nicht vorhanden ist, geschieht nichts. (Wir leiten die Fehlermeldung weiter.)
quelle