So beheben Sie all Ihre Probleme mit Crontab (Linux)
Dies ist ein Community-Wiki . Wenn Sie Fehler in dieser Antwort bemerken oder zusätzliche Informationen haben, bearbeiten Sie diese bitte.
Erstens grundlegende Terminologie:
- cron (8) ist der Daemon, der geplante Befehle ausführt.
- crontab (1) ist das Programm zum Ändern von Benutzer-crontab (5) -Dateien.
- crontab (5) ist eine Benutzerdatei, die Anweisungen für cron (8) enthält.
Als nächstes Aufklärung über Cron:
Jeder Benutzer auf einem System verfügt möglicherweise über eine eigene crontab-Datei. Der Speicherort der Root- und Benutzer-Crontab-Dateien ist systemabhängig, liegt jedoch in der Regel darunter /var/spool/cron
.
Es gibt eine systemweite /etc/crontab
Datei, das /etc/cron.d
Verzeichnis kann Crontab-Fragmente enthalten, die auch von Cron gelesen und bearbeitet werden. Einige Linux-Distributionen (z. B. Red Hat) haben /etc/cron.{hourly,daily,weekly,monthly}
auch Verzeichnisse, Skripte, die jede Stunde / Tag / Woche / Monat mit Root-Rechten ausgeführt werden.
root kann immer den Befehl crontab verwenden. regulären Benutzern kann der Zugriff gewährt werden oder nicht. Wenn Sie die crontab-Datei mit dem Befehl bearbeiten crontab -e
und speichern, überprüft crond sie auf ihre grundlegende Gültigkeit, garantiert jedoch nicht, dass Ihre crontab-Datei korrekt erstellt wurde. Es gibt eine Datei mit dem Namen, cron.deny
die angibt, welche Benutzer Cron nicht verwenden können. Der cron.deny
Dateispeicherort ist systemabhängig und kann gelöscht werden, sodass alle Benutzer cron verwenden können.
Wenn der Computer nicht eingeschaltet ist oder der crond-Daemon nicht ausgeführt wird und das Datum und die Uhrzeit für die Ausführung eines Befehls abgelaufen sind, kann crond vergangene Abfragen nicht abrufen und ausführen.
crontab Angaben, wie man einen Befehl formuliert:
Ein crontab-Befehl wird durch eine einzelne Zeile dargestellt. Sie können \
einen Befehl nicht über mehrere Zeilen erweitern. Das hash ( #
) -Zeichen stellt einen Kommentar dar, was bedeutet, dass alles in dieser Zeile von cron ignoriert wird. Führende Leerzeichen und Leerzeilen werden ignoriert.
Seien Sie SEHR vorsichtig, wenn Sie das Prozentzeichen ( %
) in Ihrem Befehl verwenden. Sofern sie nicht \%
maskiert werden , werden sie in Zeilenumbrüche umgewandelt und alles, was nach dem ersten nicht maskierten Zeilenumbruch %
passiert, wird auf stdin an Ihren Befehl übergeben.
Es gibt zwei Formate für Crontab-Dateien:
Benutzer crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
Systemweit /etc/crontab
und /etc/cron.d
Fragmente
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Beachten Sie, dass letzteres einen Benutzernamen erfordert. Der Befehl wird als benannter Benutzer ausgeführt.
Die ersten 5 Felder der Zeile geben die Zeiten an, zu denen der Befehl ausgeführt werden soll. In der Zeitangabe können Sie Zahlen oder ggf. Tag- / Monatsnamen verwenden.
- Die Felder sind durch Leerzeichen oder Tabulatoren getrennt.
- Ein Komma (
,
) wird verwendet, um eine Liste anzugeben, z. B. 1,4,6,8, was 1,4,6,8 bedeutet.
- Bereiche werden mit einem Bindestrich (
-
) angegeben und können mit Listen kombiniert werden, z. B. 1-3,9-12, dh zwischen 1 und 3, dann zwischen 9 und 12.
- Das
/
Zeichen kann verwendet werden, um einen Schritt einzuführen, z. B. 2/5, was bedeutet, dass bei 2 alle 5 begonnen wird (2,7,12,17,22 ...). Sie wickeln sich nicht über das Ende hinaus.
- Ein Sternchen (
*
) in einem Feld kennzeichnet den gesamten Bereich für dieses Feld (z. B. 0-59
für das Minutenfeld).
- Bereiche und Schritte können kombiniert werden, z. B.
*/2
bedeutet beginnend mit dem Minimum für das betreffende Feld alle 2, z. B. 0 für Minuten (0,2 ... 58), 1 für Monate (1,3 ... 11) usw.
Debuggen von Cron-Befehlen
Schauen Sie sich ihre E-Mails an!
Standardmäßig sendet cron alle Ausgaben des Befehls per E-Mail an den Benutzer, unter dem der Befehl ausgeführt wird. Wenn es keine Ausgabe gibt, gibt es keine Post. Wenn Sie möchten, dass cron E-Mails an ein anderes Konto sendet, können Sie die Umgebungsvariable MAILTO in der crontab-Datei festlegen, z
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Erfassen Sie die Ausgabe selbst
Sie können stdout und stderr in eine Datei umleiten. Die genaue Syntax zum Erfassen der Ausgabe kann je nach verwendetem Shell-Cron variieren. Hier sind zwei Beispiele, die alle Ausgaben in einer Datei speichern /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Schauen Sie sich die Protokolle an
Cron protokolliert seine Aktionen über Syslog, das (abhängig von Ihrem Setup) häufig auf /var/log/cron
oder zugreift /var/log/syslog
.
Bei Bedarf können Sie die cron-Anweisungen mit zB filtern
grep CRON /var/log/syslog
Nachdem wir uns nun mit den Grundlagen von Cron befasst haben, wo sich die Dateien befinden und wie sie verwendet werden, wollen wir uns einige häufige Probleme ansehen.
Überprüfen Sie, ob cron läuft
Wenn cron nicht läuft, werden Ihre Befehle nicht eingeplant ...
ps -ef | grep cron | grep -v grep
sollte dir sowas besorgen
root 1224 1 0 Nov16 ? 00:00:03 cron
oder
root 2018 1 0 Nov14 ? 00:00:06 crond
Wenn nicht, starten Sie es neu
/sbin/service cron start
oder
/sbin/service crond start
Es kann andere Methoden geben; Verwenden Sie, was Ihre Distribution bietet.
cron führt Ihren Befehl in einer eingeschränkten Umgebung aus.
Welche Umgebungsvariablen verfügbar sind, ist wahrscheinlich sehr begrenzt. Normalerweise werden Sie nur wenige Variablen definiert, wie erhalten $LOGNAME
, $HOME
und $PATH
.
Besonders hervorzuheben ist die PATH
Beschränkung auf /bin:/usr/bin
. Die überwiegende Mehrheit der Probleme mit "Mein Cron-Skript funktioniert nicht" wird durch diesen restriktiven Pfad verursacht . Wenn sich Ihr Befehl an einem anderen Ort befindet, können Sie dies auf verschiedene Arten lösen:
Geben Sie den vollständigen Pfad zu Ihrem Befehl an.
1 2 * * * /path/to/your/command
Geben Sie einen geeigneten PFAD in die crontab-Datei ein
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
Wenn Ihr Befehl andere Umgebungsvariablen erfordert, können Sie diese auch in der crontab-Datei definieren.
cron führt Ihren Befehl mit cwd == $ HOME aus
Unabhängig davon, wo sich das von Ihnen ausgeführte Programm im Dateisystem befindet, ist das aktuelle Arbeitsverzeichnis des Programms, wenn es von cron ausgeführt wird, das Ausgangsverzeichnis des Benutzers . Wenn Sie auf Dateien in Ihrem Programm zugreifen, müssen Sie dies berücksichtigen, wenn Sie relative Pfade verwenden, oder (vorzugsweise) überall nur vollqualifizierte Pfade verwenden, und allen eine Menge Verwirrung ersparen.
Der letzte Befehl in meiner Crontab wird nicht ausgeführt
Cron verlangt im Allgemeinen, dass Befehle mit einer neuen Zeile abgeschlossen werden. Bearbeiten Sie Ihre Crontab; Gehen Sie zum Ende der Zeile, die den letzten Befehl enthält, und fügen Sie eine neue Zeile ein (drücken Sie die Eingabetaste).
Überprüfen Sie das Crontab-Format
Sie können keine benutzer-crontab-formatierte crontab für / etc / crontab oder die Fragmente in /etc/cron.d und umgekehrt verwenden. Eine vom Benutzer formatierte crontab enthält keinen Benutzernamen an der sechsten Position einer Zeile, während eine vom System formatierte crontab den Benutzernamen enthält und den Befehl als dieser Benutzer ausführt.
Ich habe eine Datei in /etc/cron.{hourly,daily,weekly,monthly} abgelegt und sie wird nicht ausgeführt
- Stellen Sie sicher, dass der Dateiname keine Erweiterung hat, siehe run-parts
- Stellen Sie sicher, dass die Datei über Ausführungsberechtigungen verfügt.
- Teilen Sie dem System mit, was beim Ausführen Ihres Skripts verwendet werden soll (z. B.
#!/bin/sh
oben setzen)
Cron date bezogene Bugs
Wenn Ihr Datum kürzlich von einem Benutzer- oder Systemupdate, einer Zeitzone oder einem anderen geändert wurde, verhält sich crontab fehlerhaft und weist bizarre Fehler auf, die manchmal funktionieren, manchmal aber nicht. Dies ist der Versuch von crontab, zu versuchen, "zu tun, was Sie wollen", wenn sich die Zeit darunter ändert. Das Feld "Minute" wird unwirksam, nachdem die Stunde geändert wurde. In diesem Szenario werden nur Sternchen akzeptiert. Starten Sie cron neu und versuchen Sie es erneut, ohne eine Verbindung zum Internet herzustellen (damit das Datum nicht auf einen der Zeitserver zurückgesetzt werden kann).
Wieder Prozentzeichen
Um den Rat zu Prozentzeichen hervorzuheben, hier ein Beispiel, was cron mit ihnen macht:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
erstellt die ~ / cron.out-Datei mit den 3 Zeilen
foo
bar
baz
Dies ist besonders aufdringlich bei der Verwendung des date
Befehls. Achten Sie darauf, den Prozentzeichen zu entkommen
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"