Protokollierung der gesamten stderr-Ausgabe von crontab in eine Datei

12

Zum Beispiel kann ich stderrein Skript folgendermaßen protokollieren :

* * * * * run_script.sh > /var/log.txt 2>&1

Aber ich möchte stderralle Skripte in meiner crontab protokollieren . Ich kann > /var/log.txt 2>&1an alle Skripte anhängen , aber es ist nicht gut, wenn ich Hunderte von Skripten habe cron. Gibt es eine andere, einfachere Möglichkeit, dies zu tun?

Maslov Anton
quelle

Antworten:

6

In crontab können Sie MAILTO so einstellen, dass es auf einen Mail-Alias ​​verweist, der ein Skript ausführt. Dieses Skript würde eine E-Mail-Nachricht akzeptieren, die Header und andere Informationen entfernen und den Rest mit dem Logger protokollieren. Da alle Cron-Skriptausgaben an die von MAILTO angegebene Adresse gesendet werden, würden Sie alles erfassen.

Beispiel: in crontab

MAILTO=myalias

In / etc / mail / aliases (vorausgesetzt, Sie verwenden sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

Lassen Sie das Skript die E-Mail-Header entfernen und die Cron-Ausgabe verarbeiten.

Kyle Jones
quelle
Können Sie das Einrichten von MAILTO, Alias, MTA, Skript usw. präzisieren?
Endolith
1
@endolith Ich habe die Antwort bearbeitet, um eine grundlegende Einrichtung zu geben, die für sendmail und weitgehend kompatible MTAs funktionieren sollte. Sie müssen das Skript selbst schreiben.
Kyle Jones
5

Jede Ausgabe, die von einem Befehl erzeugt wird, wird an den Benutzer gesendet, der in der Umgebungsvariablen MAILTO angegeben ist, wie in der Datei crontab (5) festgelegt, oder wenn keine Variable MAILTO festgelegt ist (oder wenn es sich um einen Auftrag at (1) oder batch (1) handelt ), an den Besitzer des Jobs. Wenn ein Befehl keine Ausgabe erzeugt oder wenn die Umgebungsvariable MAILTO auf die leere Zeichenfolge gesetzt ist, wird keine Mail gesendet.

Da es lokale E-Mails verwendet, müssen Sie nichts einrichten oder mailx einfach installieren, wenn es nicht bereits vorhanden ist. Cron sendet Ihnen die Ausgabe, Sie können die E-Mail in einer Datei speichern und von dort aus viele Dinge tun. Der Versuch, die Funktionsweise von cron an Ihre Bedürfnisse anzupassen, ist nicht der richtige Weg. Wenn Sie nicht der Meinung sind, patchen Sie cron und erstellen Sie es neu. Nennen Sie es my_cron und verwenden Sie es anstelle von cron. Und seien Sie bereit, Ihr my_cron irgendwann auf dem neuesten Stand zu halten und es häufig neu zu erstellen.

Fügen Sie dies zu Beginn all Ihrer Skripte hinzu, um alles zu protokollieren und beim ersten Fehler zu stoppen

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
quelle
Sollte die Umleitungsreihenfolge das Gegenteil sein? > /var/log/YOUR_LOG_FILE 2>&1dh leiten Sie zuerst stdout zu einer Datei um und leiten Sie dann stderr zu stdout um (was jetzt auf die Datei zeigt).
jfs
Es ist ziemlich verrückt, dass Sie auf einem minimalen Server einen Mail-Service und möglicherweise einen Mail-Client installieren müssen, um die von Cron erzeugten Fehler zu lesen. Es fühlt sich an wie eine anarchistische Designentscheidung.
James McMahon
0

Das Skript von Ryan Ye unter /programming//a/7145618/20774 ist ebenfalls nützlich, obwohl es sowohl stdout als auch stderr ausführt.


Ich habe ein kleines Skript cronlog.sh, um dies zu tun. Der Skriptcode

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Dann könnten Sie tun

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Beispielergebnis

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
James McMahon
quelle