Was ist crontab? Aufgaben automatisch planen
Autor: Redaktion Domeny.ForSale Veröffentlicht
Kurz erklärt: Crontab ist eine Tabelle mit einem Zeitplan für Befehle, die der Dienst cron automatisch ausführt, meist auf Linux- und Unix-Systemen. Der Name bezeichnet auch den Befehl zur Verwaltung dieser Tabelle. Mit crontab kannst du beispielsweise täglich ein Backup erstellen oder alle paar Minuten ein Skript ausführen, ohne dich dafür manuell am Server anzumelden.
Was ist der Unterschied zwischen cron und crontab?
Cron ist ein im Hintergrund laufender Dienst, der den Zeitplan prüft und die eingetragenen Befehle zu festgelegten Zeiten ausführt. Crontab enthält die Konfiguration dieses Zeitplans. Ein Eintrag allein reicht nicht: Der Dienst cron muss installiert sein und laufen, und der Computer oder Server muss zum geplanten Zeitpunkt eingeschaltet sein.
Benutzer können eigene crontab-Tabellen haben. Eine Aufgabe wird mit den Rechten des Eigentümers der jeweiligen Tabelle ausgeführt. Ein Eintrag eines normalen Benutzers erhält also nicht automatisch Administratorrechte. Das ist sowohl für die Sicherheit als auch für den Zugriff auf Dateien wichtig.
Cron eignet sich für regelmäßige technische Aufgaben: Berichte erstellen, Daten synchronisieren oder temporäre Dateien löschen. Er reagiert jedoch nicht von sich aus auf Ereignisse wie den Eingang einer Bestellung, sondern führt Befehle zu den in der Konfiguration festgelegten Zeiten aus.
Wie liest man einen crontab-Eintrag?
In der crontab eines Benutzers enthält jeder Eintrag fünf Zeitfelder, gefolgt vom Befehl:
Minute Stunde Tag_des_Monats Monat Wochentag Befehl
Die Felder werden durch Leerzeichen oder Tabulatoren getrennt. Ihre grundlegende Bedeutung zeigt die folgende Tabelle:
| Feld | Üblicher Wertebereich | Bedeutung des Sternchens * |
|---|---|---|
| Minute | 0–59 | Jede Minute |
| Stunde | 0–23 | Jede Stunde |
| Tag des Monats | 1–31 | Jeder Tag des Monats |
| Monat | 1–12 | Jeder Monat |
| Wochentag | 0–7, meist stehen 0 und 7 für Sonntag | Jeder Wochentag |
Ein Beispieleintrag:
30 2 * * * /home/anna/bin/backup.sh
Dieser Eintrag führt das Skript backup.sh täglich um 02:30 Uhr aus. Maßgeblich ist die von cron verwendete Zeitzone, meist die auf dem Server eingestellte Zeitzone und nicht die des Computers, auf dem der Zeitplan bearbeitet wird.
Bei der Zeitangabe sind auch Kommas, Bereiche und Schrittweiten hilfreich:
0 8 * * 1-5— montags bis freitags um 08:00 Uhr.0 9,17 * * *— täglich um 09:00 und 17:00 Uhr.*/15 * * * *— in den Minuten 0, 15, 30 und 45 jeder Stunde.
Eine Schrittweite ist kein Abstand, der ab dem Ende einer Aufgabe gemessen wird. Der Eintrag */15 startet den Befehl nach der Uhrzeit, selbst wenn die vorherige Ausführung noch läuft. */7 im Minutenfeld ergibt wiederum keine gleichmäßigen Sieben-Minuten-Abstände über den ganzen Tag: Auf Minute 56 folgt Minute 0 der nächsten Stunde.
Eine wichtige Stolperfalle betrifft die Felder für den Tag des Monats und den Wochentag. Wenn beide eingeschränkt sind, genügt bei gängigen Implementierungen die Erfüllung einer der beiden Bedingungen. Der Eintrag 0 9 1 * 1 bedeutet daher: um 09:00 Uhr am ersten Tag des Monats oder an einem Montag — nicht nur an einem Montag, der auf den ersten Tag des Monats fällt. Einzelheiten zur Syntax findest du in der Dokumentation deiner Implementierung, meist über man 5 crontab.
Wie fügt man eine Aufgabe hinzu und prüft sie?
Am sichersten beginnst du mit einem unbedenklichen Test, der das Datum in eine Datei schreibt. So kannst du den Zeitplan unabhängig vom eigentlichen Skript prüfen.
- Öffne die Tabelle des aktuellen Benutzers mit
crontab -e. - Füge den folgenden Eintrag hinzu und passe die Pfade an dein System an.
- Speichere die Datei und schließe den Editor.
- Prüfe nach ein bis zwei Minuten die Ausgabedatei.
* * * * * /usr/bin/date >> /home/anna/cron-test.log 2>&1
Der Operator >> hängt die Ausgabe an die Datei an, statt sie zu überschreiben. 2>&1 leitet Fehlermeldungen an dieselbe Stelle weiter. Das Zielverzeichnis muss existieren, und der Benutzer muss Schreibrechte haben.
Der Befehl crontab -l zeigt die gespeicherten Aufgaben an. Entferne nach einem erfolgreichen Test die Testzeile mit crontab -e und trage den eigentlichen Zeitplan ein. Vorsicht mit crontab -r: Dieser Befehl löscht die gesamte Tabelle des Benutzers, nicht nur einen einzelnen Eintrag.
Verwechsle die Benutzertabelle nicht mit der systemweiten Datei /etc/crontab. In dieser Datei und in den üblichen Dateien unter /etc/cron.d/ steht zwischen den Zeitfeldern und dem Befehl ein zusätzliches Feld mit dem Namen des Benutzers, der die Aufgabe ausführt.
Warum läuft das Skript manuell, aber nicht über cron?
Cron führt Befehle in einer anderen, meist weniger umfangreichen Umgebung aus als das Terminal des Benutzers. Du solltest nicht davon ausgehen, dass cron die Shell-Konfiguration lädt, dieselben Variablen kennt oder im Verzeichnis des Skripts startet.
Prüfe bei der Fehlersuche vor allem:
- Pfade: Verwende vollständige Pfade zu Programmen und Dateien. Wenn das Skript ein bestimmtes Arbeitsverzeichnis benötigt, lege dieses ausdrücklich fest.
- Berechtigungen: Der Benutzer, unter dem die Aufgabe läuft, muss die Daten lesen und das Ergebnis schreiben können. Ein direkt gestartetes Skript benötigt Ausführungsrechte und eine korrekte Zeile, die den Interpreter angibt.
- Umgebung: Setze die benötigten Variablen und lege den richtigen Interpreter fest, statt dich auf die Konfiguration des Terminals zu verlassen.
- Logs: Protokolliere die Ausgabe und Fehler der Aufgabe. Prüfe auch den Status des Dienstes und die für dein System vorgesehenen cron-Protokolle.
Wenn eine Aufgabe länger dauern kann als der Abstand zwischen zwei Starts, verwende eine Sperre, die parallele Ausführungen verhindert, beispielsweise mit dem Werkzeug flock, sofern es verfügbar ist. Cron selbst bietet diesen Schutz nicht.
Wann brauchst du mehr als crontab?
Klassischer cron holt Aufgaben, die bei ausgeschaltetem Computer ausgefallen sind, normalerweise nicht nach. Auch eine Zeitumstellung kann die Ausführung während der betroffenen Stunden beeinflussen; das genaue Verhalten hängt von der Implementierung ab. Für einen Laptop oder Aufgaben, die nachgeholt werden müssen, kommen anacron oder ein entsprechend konfigurierter systemd-Timer infrage.
Bevor du eine wichtige Aufgabe einträgst, führe ihren Befehl manuell als der vorgesehene Benutzer aus. Prüfe anschließend die Ausführung über cron und protokolliere dabei die Fehler. Prüfe bei Backups außerdem, ob sich die Daten wiederherstellen lassen — ein erfolgreich ausgeführtes Skript beweist noch nicht, dass die Sicherung brauchbar ist.
Siehe auch: Was ist 2FA?
