web-dev-qa-db-de.com

Debuggen von Crontab-Jobs

Ich habe einen Crontab-Eintrag auf einem Linux-Server hinzugefügt, auf dem eine Java-Programmdatei ausgeführt wird. Der Java-Code verwendet eine eigene Klasse zum Protokollieren von Fehlern und Meldungen in einer Protokolldatei.

Wenn ich jedoch die Protokolldatei nach dem geplanten Zeitpunkt überprüft habe, wurden keine Nachrichten protokolliert. Es sollte mindestens eine Protokollnachricht geben, die besagt, dass die Ausführung gestartet wurde.

Es gibt also zwei mögliche Ursachen:

  1. Der Code wurde ausgeführt, aber nicht protokolliert.
  2. Oder der Code wurde überhaupt nicht ausgeführt.

Die angegebene Protokolldatei hat chmod 777-Berechtigungen, daher vermute ich, dass es sich hier um die zweite Ursache handelt.

Warum wird ein Crontab-Job nicht zur geplanten Zeit ausgeführt? Und wie kann ich das debuggen, ohne dass irgendeine Art von Protokollierung stattfindet?

Ich habe gelesen, dass bei einem Fehler eine E-Mail an den Benutzer gesendet wird. Wie erfahre ich, welche E-Mail-Adresse mit dem Benutzer verknüpft ist?

36
naiquevin

Sie können die Protokollierung für Cron-Jobs aktivieren, um Probleme zu verfolgen. Sie müssen die Datei /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf (auf Ubuntu) bearbeiten und sicherstellen, dass die folgende Zeile unkommentiert ist, oder sie hinzufügen, wenn sie fehlt:

cron.*                         /var/log/cron.log

Starten Sie dann rsyslog und cron erneut:

Sudo service rsyslog restart
Sudo service cron restart

Cron-Jobs werden in /var/log/cron.log protokolliert.

48
Mehdi Yedes

Hängen Sie 2> & 1 an das Ende Ihres Crontab-Befehls an. Dadurch wird die Ausgabe von stderr an stdout umgeleitet. Stellen Sie dann sicher, dass Sie den Unix-Befehl der Crontab protokollieren.

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun 2>&1

Dadurch wird alles vom Unix-Befehl erfasst.

Ein paar zusätzliche Hinweise (nachdem ich neulich einem Kollegen geholfen habe ...). Schreiben Sie die Umgebungsvariablen aus, indem Sie den Befehlssatz ohne Parameter ausgeben. Lassen Sie die Shell jeden Befehl mit dem Befehl set -x wiederholen. An der Spitze Ihrer Skriptausgabe;

set
set -x
27
Karl

Vorausgesetzt, dass die manuelle Ausführung des Befehls funktioniert, jedoch nicht in Cron, kann es sein, dass der korrekte Pfad nicht dem cron-Befehl ausgesetzt ist. Sie können dies beheben, indem Sie crontab -e ausführen und dann den Pfad direkt in die Cron-Registerkarte eingeben:

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

1
user189271

Prüfen Sie, ob Sie die Uhrzeit wirklich formatiert haben, zu der sie gut laufen muss.

Zum Beispiel statt 

*/1 * * * * echo 'debug' > /home/glab/change_branch.log

könnte das sein:

1 * * * * echo 'debug' > /home/glab/change_branch.log

und Sie können erwarten, dass es jede Minute läuft. Und es werden auch keine Protokolle erzeugt.

0
Darius.V

Eine Sache, die möglicherweise Ihr Problem verursacht, ist, dass cron (zumindest in der von mir verwendeten Distribution, Amazon Linux OS) die Zeit als UTC betrachtet, wenn Sie sich also in einer anderen Zeitzone befinden (z. B. -03: 00) Wenn Sie davon ausgehen, dass es 3 Stunden im Voraus läuft, wird dies tatsächlich der Fall sein und tatsächlich haben Sie keine Probleme.

0
Renato Gama