Cron-E-Mails deaktivieren, sofern keine Fehler vorliegen?

12

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".

Labyrinth
quelle
Was ist, wenn Crond selbst nicht läuft? Oder ist die Maschine offline? Deshalb beschäftige ich mich nie mit E-Mails von cron und nutze einen dedizierten cron-Überwachungsdienst. Ich bin ein Teil von WDT.io und empfehle es.
Christian Pekeler

Antworten:

8

Da Sie sich nicht um die Ausgabe kümmern, können Sie das STDOUT eines Jobs an umleiten /dev/nullund das STDERR per E-Mail senden lassen (mithilfe der MAILTOUmgebungsvariablen).

Also zum Beispiel:

...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null

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 cronJob.

heemayl
quelle
1
Der Nachteil dieses Ansatzes ist, dass Sie bei einem Fehlschlagen nur die STDERR-Ausgabe erhalten, was die Diagnose möglicherweise schwieriger macht als bei voller Ausgabe.
Plugwash
10

Der chronicBefehl von moreutils führt einen Befehl im Hintergrund aus, sofern er nicht fehlschlägt.

Zitat aus seinem Handbuch:

chronic führt einen Befehl aus und veranlasst, dass sein Standard-Out und sein Standard-Error nur angezeigt werden, wenn der Befehl fehlschlägt (beendet ungleich Null oder stürzt ab). Wenn der Befehl erfolgreich ausgeführt wird, werden alle externen Ausgaben ausgeblendet.

Eine häufige Verwendung für chronische ist die Ausführung eines Cron-Jobs. Anstatt zu versuchen, den Befehl ruhig zu halten und sich mit Mails zu befassen, die versehentlich ausgegeben werden, wenn dies erfolgreich ist, und nicht genügend Ausgaben zu machen, wenn dies fehlschlägt, können Sie ihn einfach immer ausführlich ausführen und chronisch verwenden, um die erfolgreiche Ausgabe auszublenden.

Michał Politowski
quelle
8

Wie kann ich nur bei Fehlern E-Mails von cron erhalten?

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 nur cronic, sofern Sie PATHrichtig 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:

Kosmischer Ossifrage
quelle
1
Steht das in cronicBeziehung chronicoder ist das nur Zufall?
Toby Speight
@TobySpeight Zufall scheint es. cronicwird in bash implementiert, chronicwie in der vorherigen Antwort vorgeschlagen, ist ein Perl-Skript.
Cosmic Ossifrage
4

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:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

Gleich, aber mit einer bestimmten Adresse und Betreff:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]

Sie können sogar mehrere Aktionen bei Fehlern ausführen und der E-Mail hinzufügen:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

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.

Akom
quelle
Sie sollten setzen $OUTPUTin Anführungszeichen: "$OUTPUT".
G-Man sagt, dass Monica
@ G-Man Fair point, es besteht immer die Möglichkeit, dass die Ausgabe "-n" oder ähnliches enthält.
Akom
0

Ich habe das wahrscheinlich noch nicht durchgedacht, aber

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

Im Normalfall würden Sie alles in eine temporäre Datei umleiten (mit der Sie wahrscheinlich mktempeinen eindeutigen Dateinamen erhalten möchten ), löschen, wenn die Datei erfolgreich war, und catden 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.)

Ulrich Schwarz
quelle