![Ist für Cron-Jobs eine erweiterte Protokollierung verfügbar?](https://rvso.com/image/52111/Ist%20f%C3%BCr%20Cron-Jobs%20eine%20erweiterte%20Protokollierung%20verf%C3%BCgbar%3F.png)
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 stdout
oder stderr
die Skripte im Cron nicht verfügbar. Dies zeigt, dass der run-parts
Befehl ü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.daily
um 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 newaliases
Befehl 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
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 aliases
Ziel 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 -s
Option 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.