Was ist cron und wie plant man Aufgaben?

Autor: Veröffentlicht

Kurz erklärt: Cron ist ein Mechanismus in Unix- und Linux-Systemen, der Befehle oder Skripte automatisch nach einem festgelegten Zeitplan ausführt. Damit lassen sich Backups erstellen, Berichte erzeugen oder alte Dateien löschen, beispielsweise täglich um 2:30 Uhr. Damit eine Aufgabe korrekt funktioniert, müssen neben dem Zeitpunkt auch der Befehl, die Berechtigungen und die Prüfung auf Fehler festgelegt werden.

Wie funktioniert cron und wozu dient es?

Cron läuft als Systemdienst im Hintergrund: Es prüft den Zeitplan und führt die darin eingetragenen Befehle aus. Ein einzelner Befehl mit einem Ausführungszeitpunkt wird als Cronjob bezeichnet. Eine crontab ist die Tabelle, in der die Zeitpläne der Aufgaben gespeichert sind.

Typische Anwendungen sind nächtliche Datenbankexporte, das Abrufen von Daten aus einem externen System, die Neuberechnung von Auswertungen und das Aufräumen temporärer Dateien. Cron ist für den Start einer Operation zuständig, nicht für deren Logik. Enthält ein Backup-Skript einen Fehler, behebt der Zeitplan diesen nicht und bestätigt auch nicht, dass sich das Backup wiederherstellen lässt.

Die Aufgabe wird mit den Berechtigungen des Benutzers ausgeführt, dem der Eintrag gehört. In der Regel muss sie nicht als Systemadministrator laufen. Das Konto sollte nur Zugriff auf die Dateien und Ressourcen haben, die für die jeweilige Operation benötigt werden.

Wie liest man einen Zeitplaneintrag?

In einer typischen Benutzer-crontab besteht ein Eintrag aus fünf Zeitfeldern und einem Befehl. Die Felder stehen von links nach rechts für Minute, Stunde, Tag des Monats, Monat und Wochentag.

30 2 * * * /usr/bin/python3 /home/max/skripte/bericht.py

Dieser Eintrag startet das Skript täglich um 2:30 Uhr. Ein Stern steht für jeden zulässigen Wert des jeweiligen Feldes. Die drei Sterne bedeuten daher: an jedem Tag des Monats, in jedem Monat und an jedem Wochentag.

ZeitplanBedeutung
*/15 * * * *Alle Viertelstunde: zu den Minuten 0, 15, 30 und 45
0 8 * * 1-5Montag bis Freitag um 8:00 Uhr
0 3 1 * *Am ersten Tag jedes Monats um 3:00 Uhr

Ein Schrägstrich legt die Schrittweite im jeweiligen Feld fest, ein Bindestrich einen Bereich und ein Komma trennt einzelne Werte, beispielsweise 0,30 im Minutenfeld. Die Schreibweise */15 bedeutet nicht „15 Minuten nach Abschluss der vorherigen Aufgabe“ — der Zeitplan richtet sich nach der Uhrzeit.

Vorsicht ist geboten, wenn sowohl der Tag des Monats als auch der Wochentag eingeschränkt werden. In verbreiteten cron-Implementierungen genügt es dann, dass eine der beiden Bedingungen erfüllt ist, nicht beide. Prüfe vor der Verwendung eines solchen Eintrags die Dokumentation der auf dem Server verfügbaren Version.

Systemdateien wie /etc/crontab enthalten vor dem Befehl zusätzlich ein Benutzerfeld. Kopiere ihre Einträge nicht unverändert in deine persönliche crontab.

Wie richtet man den ersten Cronjob ein?

Auf einem Server mit installiertem cron und Terminalzugang kannst du wie folgt vorgehen. Die Pfade sind Beispiele — ersetze sie durch die tatsächlichen Speicherorte in deinem Konto.

  1. Prüfe den Befehl manuell. Führe /usr/bin/python3 /home/max/skripte/bericht.py unter demselben Benutzerkonto aus, das später die Aufgabe ausführen soll.

  2. Öffne den Zeitplan mit crontab -e.

  3. Füge einen Eintrag hinzu, der die Ausgabe in eine Datei schreibt:

    30 2 * * * /usr/bin/python3 /home/max/skripte/bericht.py >> /home/max/logs/bericht.log 2>&1
    
  4. Speichere die Änderungen und prüfe die Einträge mit crontab -l.

  5. Prüfe nach dem geplanten Zeitpunkt das Ergebnis, beispielsweise den erzeugten Bericht, sowie den Inhalt der Protokolldatei.

Der Operator >> hängt Meldungen an die Datei an. 2>&1 leitet auch Fehlermeldungen dorthin um. Das Verzeichnis logs muss bereits existieren, und der Benutzer, der die Aufgabe ausführt, muss darin schreiben dürfen. Die Protokolldatei kann unbegrenzt wachsen. Bei dauerhafter Nutzung braucht sie deshalb eine Größenbegrenzung oder eine Rotation, also das regelmäßige Archivieren und Löschen alter Einträge.

Beim Shared Hosting wird der Zeitplan häufig im Verwaltungsbereich statt im Terminal eingerichtet. Prüfe in der Dokumentation des Anbieters den Mindestabstand zwischen Ausführungen, die verfügbaren Interpreter und die Laufzeitbegrenzungen.

Warum funktioniert die Aufgabe nicht, obwohl der Befehl manuell funktioniert?

Cron führt Befehle in einer eingeschränkteren Umgebung aus als ein interaktives Terminal. Dort stehen möglicherweise nicht dieselben Umgebungsvariablen, Programmpfade oder Shell-Einstellungen zur Verfügung. Verwende deshalb vollständige Pfade und gehe nicht davon aus, dass das Arbeitsverzeichnis dem Verzeichnis des Skripts entspricht.

Wenn ein Programm aus einem bestimmten Verzeichnis gestartet werden muss, kann der Eintrag so aussehen:

0 6 * * * cd /home/max/anwendung && /usr/bin/python3 bericht.py

Liefert die Aufgabe kein Ergebnis, prüfe der Reihe nach: ob der cron-Dienst läuft, welches Konto die Aufgabe ausführt, die Berechtigungen, die Pfade, die erforderlichen Variablen sowie die System- und Anwendungsprotokolle. Eine fehlende Fehlermeldung allein belegt keinen Erfolg — das Skript sollte einen Fehlschlag melden und die Überprüfung des Ergebnisses ermöglichen.

Der Ausführungszeitpunkt hängt auch von der eingestellten Zeitzone ab. Prüfe sie auf dem Server oder im Verwaltungsbereich des Hostings, insbesondere wenn die Aufgabe nach polnischer Ortszeit ausgeführt werden soll. Wie Aufgaben behandelt werden, die bei einer Zeitumstellung in eine übersprungene oder doppelt vorkommende Stunde fallen, hängt von der Implementierung ab.

Welche Grenzen hat cron?

Klassisches cron holt Ausführungen, die während einer Abschaltung des Servers ausfallen, grundsätzlich nicht nach. Es verhindert auch nicht automatisch, dass sich Aufgaben überschneiden: Läuft ein Skript 20 Minuten und wird alle 10 Minuten gestartet, können zwei Instanzen gleichzeitig laufen. Verwende bei Operationen auf gemeinsam genutzten Daten eine Sperre, beispielsweise den Mechanismus flock, der auf vielen Linux-Systemen verfügbar ist.

Für Aufgaben, die ausgefallene Ausführungen nachholen müssen, kommen anacron oder entsprechend konfigurierte systemd-Timer infrage. Wenn du Operationen in eine Warteschlange einreihen und nach einem Fehlschlag erneut ausführen musst, kann eine Aufgabenwarteschlange die bessere Lösung sein.

Verwechsle den systemweiten cron-Dienst auch nicht mit WP-Cron in WordPress. WP-Cron prüft geplante Aufgaben standardmäßig bei Anfragen an die Website. Bei geringem Datenverkehr kann sich ihre Ausführung deshalb verzögern.

Teste deine erste Automatisierung mit einer unkritischen Aufgabe und protokolliere die Ergebnisse. Lass sie erst dann Daten löschen oder Backups erstellen, wenn du das tatsächliche Ergebnis überprüft hast.

Siehe auch: Was ist 2FA?

Lesen Sie auch

Wie PHP-FPM PHP-Anfragen verarbeitet, sich vom Webserver unterscheidet und wie du Prozesse an Last und Hosting-Ressourcen anpasst.
BIND ist offene DNS-Serversoftware. Erfahre, welche Aufgaben sie übernimmt und wann sich der Betrieb eines eigenen Servers lohnt.
Was Polens REGON-Register und seine Kennnummer bedeuten, wie sie sich von NIP und KRS unterscheiden und wie Sie Unternehmensdaten prüfen.