Wo werden Cron-Fehler protokolliert?

170

Wenn ich cronJobs falsch einrichte, scheinen sie unbemerkt fehlzuschlagen. Wo soll ich nach einem Fehlerprotokoll suchen, um zu verstehen, was schief gelaufen ist?

Brian Lyttle
quelle

Antworten:

106

Wie bereits erwähnt, erhalten Sie croneine E-Mail mit der Ausgabe aller ausgeführten Programme (sofern vorhanden). Wenn Sie also keine Ausgabe erhalten, gibt es grundsätzlich drei Möglichkeiten:

  1. crond konnte nicht einmal eine Shell zum Ausführen des Programms oder zum Senden von E-Mails starten
  2. crond Beim Versenden der Ausgabe sind Probleme aufgetreten, oder die E-Mail ging verloren.
  3. das Programm hat keine Ausgabe erzeugt (einschließlich Fehlermeldungen)

Fall 1. ist sehr unwahrscheinlich, aber etwas sollte in den Cron-Protokollen geschrieben worden sein. Cron verfügt über eine eigene reservierte Syslog-Einrichtung, daher sollten Sie einen Blick in /etc/syslog.conf(oder die entsprechende Datei in Ihrer Distribution) werfen, um zu sehen, wohin die Nachrichten der Einrichtung crongesendet werden. Beliebte Ziele sind /var/log/cron, /var/log/messagesund /var/log/syslog.

In Fall 2. sollten Sie die Mailer-Daemon-Protokolle überprüfen: Nachrichten vom Cron-Daemon werden normalerweise ab angezeigt root@yourhost. Sie können eine MAILTO=...Zeile in der crontab-Datei verwenden, damit cron eine E-Mail an eine bestimmte Adresse sendet, was das Durchsuchen der Mailer-Daemon-Protokolle erleichtern soll. Zum Beispiel:

[email protected]
00 15 * * *  echo "Just testing if crond sends email"

In Fall 3 können Sie testen, ob das Programm tatsächlich ausgeführt wurde, indem Sie einen anderen Befehl anhängen, dessen Wirkung Sie leicht überprüfen können:

00 15 * * * /a/command; touch /tmp/a_command_has_run

so kannst du überprüfen, ob crondtatsächlich etwas gelaufen ist, indem du die mtime von betrachtest /tmp/a_command_has_run.

Riccardo Murri
quelle
3
Gehen diese "E-Mails" auch in eine Datei? Ich verwende Shared Web Hosting und glaube nicht, dass sie wissen, wo sie mir eine E-Mail schicken sollen.
Nathan Long
3
Ich schätze den Rat in Fall 3, um zu überprüfen, ob der Befehl überhaupt ausgeführt wird. In meinem Fall hat cron meinen Job nicht ausgeführt, weil ich kürzlich die Zeitzone des Servers geändert hatte und den cron-Server neu starten musste, damit die cron-Zeiten in der richtigen Zeitzone ausgewertet wurden.
Nathan
1
Abhängig von Ihrem E-Mail-Transfer-Agent können Sie nicht zugestellte E-Mails auch in einer Datei finden, die dead.letterim Stammverzeichnis oder im jeweiligen Benutzerverzeichnis aufgerufen wird .
Dario Seidl
43

Sie können die Jobausgabe jederzeit explizit an eine Protokolldatei senden:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

Beachten Sie, dass dies das zuvor erwähnte E-Mail-Verhalten ersetzt, da crond selbst keine Ausgabe vom Job erhält. Wenn Sie dieses Verhalten beibehalten möchten, sollten Sie tee (1) untersuchen.

Codehead
quelle
9
Warum nicht >>statt verwenden >, damit Sie die Protokolldatei nicht jedes Mal überschreiben?
Chris
Sicher! Jede Art von E / A-Umleitung kann ausgeführt werden, auch | /usr/bin/loggerwenn Sie dies wünschen, wie von Stefan geschickt vorgeschlagen. Wählen Sie Ihr Gift: tldp.org/LDP/abs/html/io-redirection.html
Codehead
cron hat diese Protokolldatei myjob.logwie erwartet mit der Größe 0 erstellt, sie wurde jedoch in einer anderen Datei protokolliert. Wo kann ich diese Einstellung ändern?
Buchhalter م
42

Wenn Sie die E-Mails nicht sehen, spammen Sie möglicherweise root @ yourcompany mit den Fehlern, die für die Personen, die dieses Konto für die Überwachung verwenden, ziemlich ärgerlich sein können. Versuchen Sie stattdessen, die Ausgabe an Syslog zu senden:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

Warten Sie dann, bis der Cronjob ausgeführt wird, und suchen Sie in / var / log / messages (oder auf einigen Systemen in /var/log/user.log) nach dem Fehler.

Dies funktioniert hervorragend für Fehlermeldungen, die nur 1-2 Zeilen lang sind, wie "yourcronjob: Befehl nicht gefunden". Es nutzt auch Ihre vorhandene Syslog-Infrastruktur (Logrotation, zentrales Syslogging, Splunk usw.). Es reduziert auch E-Mail-Spam auf das Stammverzeichnis.

Es ist möglicherweise keine gute Lösung, wenn Ihr Cronjob Hunderte von Ausgabezeilen generiert.

Stefan Lasiewski
quelle
8

Die Standard-Cron-Konfiguration sendet Ihnen eine E-Mail mit der Ausgabe Ihres Programms. Wenn dies fehlschlägt, können Sie versuchen, Ihr fehlerhaftes Programm in ein Shell-Skript einzubinden, das sicherstellt, dass das Programm nicht fehlschlägt, und Sie können die Ausgabe weiter protokollieren.

Dies ist eine konfigurierbare Einstellung bei einigen Cron-Implementierungen.

miguel.de.icaza
quelle
7

Sie sollten eine E-Mail erhalten, crondwenn der Job entweder nicht ausgeführt werden kann oder wenn der Job einen Beendigungscode ungleich Null zurückgibt. Versuchen Sie Folgendes einzugeben:

$ mailx

an der Eingabeaufforderung.

mailx(1)ist das grundlegende Programm zum Lesen von E-Mails auf den meisten Unix-Systemen. Es ist für moderne Verhältnisse sehr primitiv, aber Sie können sich darauf verlassen, dass es immer verfügbar ist. Andere, bessere E-Mail-Agenten sind möglicherweise verfügbar, aber es gibt genug, von denen Sie nie wissen, welcher auf einem zufälligen Computer installiert ist, den Sie gerade verwenden.

Beachten Sie, dass dieses Mail-Subsystem nur auf dem Computer verwendet wird, wenn Sie Ihr System nicht als Internet-E-Mail-Server konfiguriert haben. Sie können E-Mails an andere Benutzer auf dem Computer senden und von diesen empfangen, aber möglicherweise können Sie keine E-Mails an die Welt senden, und E-Mails aus der Außenwelt können auf keinen Fall auf Ihren Computer gelangen.

Warren Young
quelle
5

Cron protokolliert grundlegende Informationen an /var/log/messages, sendet jedoch alle Programmausgaben an den aufrufenden Benutzer.

Hemant
quelle
Auf /var/log/messagesmeinem Ubuntu-Server gibt es kein ( 4.4.0-128-generic #154-Ubuntu SMP). Irgendeine Idee warum? Ich habe rootseit Monaten (zB apt autoremove) ein paar Cron-Jobs in der Crontab definiert , aber keine scheint ausgeführt worden zu sein.
Dan Dascalescu
2

Ich bin vor ein paar Jahren auf diesen Thread gestoßen und habe vor kurzem eine Lösung für die oben genannten Fälle von Ricardo gefunden. Das Fehlen einer E-Mail ist schwer zu erkennen (wie Sie bereits erwähnt haben) und Sie möchten auf keinen Fall Ihre root @ yourcompany-E-Mail als Spam versenden. Bei Interesse schauen Sie auf deadmanssnitch.com. . Dieses Tool scheint die oben genannten Fälle zu lösen. Scheint ziemlich einfach zu sein - fügen Sie einfach den Code hinzu, den Sie mit dem Tool für Ihren Cronjob erhalten. Wenn Ihr Job bei einem bestimmten internen Server nicht ausgeführt werden kann, werden Sie benachrichtigt. Wenn Ihr Job wieder ausgeführt wird, werden Sie ebenfalls benachrichtigt.

ss_jt
quelle
1

Ich benutze vixie-cron, damit ich nicht weiß, ob dies für alles gilt. Aber ich habe eine dead.letterDatei, die die gesamte Ausgabe des Jobs enthält.

In meinem /root/Ordner habe ich crons.crondie ich als meine Crontab durch Laufen gesetzt habe crontab /root/crons.cron. dead.letterwird auch in erstellt /root/.

Ich bearbeite nur Google dead.letterund es ist eine unzustellbare Mail. Es hat anscheinend nichts mit cron zu tun. Wenn Sie Ihre E-Mails nicht richtig eingerichtet haben (wie ich), haben Sie die Datei.

jonescb
quelle
0

Für Neulinge könnte dies ein Problem sein. Achten Sie darauf, die Minuten- und Stundenwerte nicht zu vertauschen. Die Minute kommt zuerst, dann die Stunde. Wenn Sie für jeden Wert weniger als 12 eingeben, werden diese zwar akzeptiert, funktionieren jedoch möglicherweise nicht wie erwartet oder überhaupt nicht.

Michael Woyo
quelle
2
Sie haben Recht, aber ich bin nicht sicher, ob dies die Frage wirklich beantwortet.
Roaima