Ist für Cron-Jobs eine erweiterte Protokollierung verfügbar?

Ist für Cron-Jobs eine erweiterte Protokollierung verfügbar?

Ich habe 3 Skripte unter /etc/cron.daily. Meine Cron-Protokolle sind in geschrieben /var/log/cron. Das Folgende ist ein Eintrag für den oben ausgeführten Cron.

(root) CMD (run-parts /etc/cron.hourly)

Hier ist das stdoutoder stderrdie Skripte im Cron nicht verfügbar. Dies zeigt, dass der run-partsBefehl über diesen Ordner ausgeführt wurde.

Gibt es irgendwelche Tricks, die helfen können, zu protokollieren, was während der Ausführung der drei Skripte passiert ist?

HINWEIS: Ich kann die Skripte nicht bearbeiten, cron.dailyum Ausgaben und Fehler in eine Protokolldatei umzuleiten.

Antwort1

Unter Unix ist das Mailsystem das Mittel, mit dem Systembenachrichtigungen an Benutzer übermittelt werden. Sie können es sich ähnlich wie unter Windows vorstellen, wo etwas in Ihrer Taskleiste mit einer Popup-Nachricht angezeigt wird, wenn Sie über etwas benachrichtigt werden müssen. Da Cronjobs (theoretisch) keine Ausgabe erzeugen sollten (da niemand da sein sollte, um sie zu sehen), wird jede Ausgabe (stdout oder stderr) so behandelt, als ob sie ein möglicher Hinweis auf einen Fehler oder ein Problem wäre, und daher wird eine E-Mail an den Besitzer des Cronjobs gesendet, um ihn aufzufordern, dies zu überprüfen.

Somit werden alle Ausgaben (stdout und stderr) über das lokale Mailsystem an den Besitzer des Cronjobs gesendet. Wenn der Besitzer ein nicht-persönliches Konto ist, können Sie den lokalen MTA anweisen, die Weiterleitung an ein echtes E-Mail-Konto vorzunehmen, indem Sie einen Alias ​​einrichten. Ich habe beispielsweise Folgendes hinzugefügt /etc/aliases:

root: [email protected]

Dann habe ich den newaliasesBefehl ausgeführt (um die Mail-Alias-Datenbank neu zu erstellen). Danach begann ich, Root-E-Mails im Posteingang meiner Firmen-E-Mail zu erhalten:

root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only

Betrachten Sie es in seiner ganzen Pracht

Das ist also der mehr oder weniger normale Weg (das System Benachrichtigungs-E-Mails senden lassen). Es gibt andere Möglichkeiten, mit der Benachrichtigung umzugehen. Einige Alternativen:

Ändern von Aliasnamen zum Speichern der E-Mails in einer bestimmten Datei:

root: /var/log/rootMails

Weiterleiten der E-Mail an ein Skript:

root: |/usr/local/bin/filterMail

Eine Alternative zum Herumspielen mit Aliasen ist die Verwendung der MAILTO=Option in der Crontab des Benutzers, die von vielen Cron-Daemons unterstützt wird. Dies kann vorzuziehen sein, wenn Sie nur einen bestimmten Satz von Benachrichtigungen des Benutzers erhalten möchten und nicht alles, was in dessen Postfach abgelegt wird (was das aliasesZiel ist).

Ich bin sicher, dass es noch viele andere gibt, aber Sie möchten wahrscheinlich die erste oder letzte machen.

Antwort2

Sie können cron mit der -sOption ausführen, Syslog zu verwenden, anstatt E-Mails zu senden. Dies funktioniert zumindest unter RHEL und seinen Derivaten, FreeBSD und MacOS.

Antwort3

Sie können die Protokollierung selbst in einem Bash-Skript durchführen:

logfile=/var/log/mine/whatever.log

log () {
    timestamp=$(date +'%F %T')
    echo -e "$timestamp $1" >> $logfile
    shift
    for a; do
        echo -ne "$a" >> $logfile
    done
}    

log "Hello world.\nAnd so on..."

[...]

Wenn Sie Befehle ausführen, deren Ausgabe Sie protokollieren möchten:

somecommand 2>&1 >> $logfile

Sie können Meldungen und Fehler auch an den Systemlogger (siehe man logger) senden und diese ggf. über die Syslog-Konfiguration aussortieren.

verwandte Informationen