Was ist ein Cronjob?
Ein Cronjob besteht aus zwei Teilen: einem Zeitplan und einem Befehl. Der Zeitplan legt fest, wann etwas geschieht. Der Befehl legt fest, was geschieht, meist der Aufruf eines Skripts oder Programms.
Die wichtigsten Begriffe:
- Cron: der Dienst (Daemon), der im Hintergrund läuft und die Aufgaben startet.
- Crontab: die Tabelle, in der die Aufgaben stehen. Jeder Benutzer hat eine eigene Crontab, dazu kommt eine für das gesamte System.
- Cronjob: eine einzelne Zeile in der Crontab, also eine geplante Aufgabe.
- Cron-Ausdruck: die Schreibweise des Zeitplans, zum Beispiel
0 3 * * *für „täglich um 3 Uhr“.
Cronjob und Cron Job bedeuten dasselbe. Im Deutschen ist die Schreibweise in einem Wort verbreitet, im Englischen schreibt man „cron job“.
Wie funktioniert Cron?
Der Cron-Dienst startet mit dem Server und prüft einmal pro Minute, ob in einer Crontab eine Aufgabe für diese Minute eingetragen ist. Wenn ja, führt er den Befehl aus, und zwar mit den Rechten des Benutzers, dem die Crontab gehört.
Drei Eigenschaften sollte man kennen:
- Die kleinste Einheit ist die Minute. Aufgaben im Sekundentakt lassen sich mit Cron nicht planen.
- Cron holt nichts nach. War der Server zum geplanten Zeitpunkt ausgeschaltet, fällt die Aufgabe aus.
- Cron kennt die Umgebung Ihrer Anmeldung nicht. Befehle laufen mit einer sehr kleinen Umgebung. Das ist die häufigste Ursache dafür, dass ein Skript von Hand funktioniert und als Cronjob nicht.
Die Cron-Syntax: fünf Felder und ein Befehl
Jede Zeile der Crontab hat denselben Aufbau: fünf Felder für den Zeitpunkt, getrennt durch Leerzeichen, danach der Befehl.
Minute Stunde Tag Monat Wochentag Befehl
- Minute: 0 bis 59
- Stunde: 0 bis 23
- Tag im Monat: 1 bis 31
- Monat: 1 bis 12 oder jan bis dec
- Wochentag: 0 bis 7 oder sun bis sat, wobei 0 und 7 beide für Sonntag stehen
In jedem Feld sind diese Zeichen erlaubt:
*steht für jeden Wert.,trennt mehrere Werte:1,15im Feld Tag bedeutet am 1. und am 15.-bildet einen Bereich:1-5im Feld Wochentag bedeutet Montag bis Freitag./bildet Schritte:*/15im Feld Minute bedeutet alle 15 Minuten.
Eine Besonderheit führt oft zu Überraschungen: Sind sowohl der Tag im Monat als auch der Wochentag eingeschränkt, läuft die Aufgabe, sobald eines von beiden zutrifft. 0 8 13 * 5 bedeutet also nicht „Freitag, der 13.“, sondern „an jedem 13. und an jedem Freitag“.
Für häufige Zeitpläne gibt es Kurzformen: @hourly, @daily, @weekly, @monthly, @yearly und @reboot für „einmal nach dem Start des Servers“.
Beispiele für Cron-Ausdrücke
Die folgenden Ausdrücke decken die meisten Fälle ab und lassen sich direkt übernehmen:
* * * * *jede Minute*/5 * * * *alle 5 Minuten0 * * * *zu jeder vollen Stunde30 2 * * *täglich um 2:30 Uhr0 8,18 * * *täglich um 8 Uhr und um 18 Uhr0 7 * * 1-5montags bis freitags um 7 Uhr0 6 * * 1jeden Montag um 6 Uhr0 0 1 * *am Ersten jedes Monats um Mitternacht0 9 1 1,4,7,10 *am ersten Tag jedes Quartals um 9 Uhr0 22 * * 0jeden Sonntag um 22 Uhr
Eine vollständige Zeile mit Befehl sieht so aus:
30 2 * * * /usr/bin/php /var/www/shop/bin/feed-export.php >> /var/log/feed-export.log 2>&1
Sie startet jede Nacht um 2:30 Uhr ein PHP-Skript und schreibt Ausgaben und Fehlermeldungen in eine Protokolldatei.
Cron-Ausdruck prüfen: der Cron-Generator
Tragen Sie einen Cron-Ausdruck ein oder wählen Sie ein Beispiel. Das Werkzeug erklärt jedes der fünf Felder und zeigt die nächsten fünf Ausführungen in Ihrer Ortszeit. So sehen Sie vor dem Eintrag in die Crontab, ob der Zeitplan stimmt.
Das Werkzeug versteht die übliche Schreibweise mit fünf Feldern: *, Listen, Bereiche, Schritte, Namen für Monate und Wochentage sowie Kurzformen wie @daily. Sekunden, Jahre und Sonderzeichen anderer Systeme wie L, W oder # werden nicht unterstützt.
Cronjob einrichten: Schritt für Schritt
Auf einem Server mit Zugriff auf die Kommandozeile richten Sie einen Cronjob in vier Schritten ein:
- Crontab öffnen: Der Befehl
crontab -eöffnet die Crontab des angemeldeten Benutzers in einem Texteditor. - Zeile eintragen: Schreiben Sie Zeitplan und Befehl in eine neue Zeile. Verwenden Sie vollständige Pfade für Programme und Dateien.
- Speichern und schließen: Cron übernimmt die Änderung sofort. Ein Neustart ist nicht nötig.
- Prüfen:
crontab -lzeigt alle eingetragenen Aufgaben an. Testen Sie die Aufgabe zuerst mit einem Zeitpunkt wenige Minuten in der Zukunft.
Vorsicht mit crontab -r: Der Befehl löscht die gesamte Crontab ohne Rückfrage.
Neben den Crontabs der Benutzer gibt es die Systemdateien /etc/crontab und das Verzeichnis /etc/cron.d. Dort steht zwischen Zeitplan und Befehl zusätzlich der Benutzer, unter dem die Aufgabe läuft.
Ohne Kommandozeile: Bei den meisten Hosting-Paketen legen Sie Cronjobs in der Verwaltungsoberfläche an, etwa in Plesk oder cPanel. Dort wählen Sie den Zeitplan aus und tragen den Befehl oder die Adresse eines Skripts ein. Die Logik dahinter ist dieselbe.
Wofür werden Cronjobs im Website-Betrieb eingesetzt?
Fast jede größere Website und jeder Shop nutzt Cronjobs, oft ohne dass es auffällt. Typische Aufgaben:
- Datensicherungen von Datenbank und Dateien
- Produktdaten: Export und Aktualisierung von Feeds für Google Shopping, Preisvergleicher und Affiliate-Netzwerke, mehr dazu unter Feed-Optimierung
- XML-Sitemaps neu erzeugen
- Zwischenspeicher leeren und vorwärmen
- Import und Abgleich von Lagerbeständen und Preisen aus der Warenwirtschaft
- Berichte: Daten über eine API abrufen und als Auswertung versenden
- Aufräumen: alte Sitzungen, temporäre Dateien und Logdateien rotieren oder löschen
- E-Mails: Newsletter und Benachrichtigungen aus einer Warteschlange versenden
Für SEO ist das wichtiger, als es klingt. Läuft der Cronjob für den Feed nicht, zeigt Google veraltete Preise. Wird die Sitemap nicht erneuert, findet Google neue Seiten später. Ein aufwendiger Cronjob zur Hauptbesuchszeit kann den Server bremsen und die Ladezeit verschlechtern. Solche Aufgaben gehören in die Nacht.
WordPress: WP-Cron und echter Cronjob
WordPress bringt ein eigenes System für geplante Aufgaben mit, den WP-Cron. Er veröffentlicht geplante Beiträge, sucht nach Updates und führt Aufgaben von Plugins aus. WP-Cron ist allerdings kein echter Cronjob: Er wird nicht von der Uhr ausgelöst, sondern von Seitenaufrufen. Bei jedem Besuch prüft WordPress, ob Aufgaben fällig sind.
Das hat zwei Nachteile:
- Wenig Besucher: Aufgaben laufen verspätet oder gar nicht. Ein für 6 Uhr geplanter Beitrag erscheint erst mit dem ersten Seitenaufruf danach.
- Viele Besucher: Die Prüfung läuft bei jedem Aufruf mit und kostet Leistung. Ein Seitencache kann außerdem verhindern, dass WP-Cron überhaupt ausgelöst wird.
Die Lösung ist ein echter Cronjob. Dazu schalten Sie den eingebauten Auslöser in der Datei wp-config.php ab:
define('DISABLE_WP_CRON', true);
Anschließend ruft ein Cronjob des Servers die Datei wp-cron.php regelmäßig auf, zum Beispiel alle fünf Minuten:
*/5 * * * * wget -q -O /dev/null "https://www.example.com/wp-cron.php?doing_wp_cron"
Solche Einstellungen gehören zu unserer Arbeit im WordPress-SEO.
Fehlersuche: Warum läuft mein Cronjob nicht?
Wenn ein Cronjob nicht oder anders als erwartet läuft, liegt es fast immer an einer dieser Ursachen:
- Fehlende Pfade: Cron kennt nur wenige Verzeichnisse. Schreiben Sie Programme mit vollständigem Pfad, also
/usr/bin/phpstattphp, und verwenden Sie auch im Skript keine relativen Pfade. - Fehlende Rechte: Das Skript muss für den Benutzer der Crontab ausführbar sein, und er muss in die Zielverzeichnisse schreiben dürfen.
- Falsche Zeitzone: Cron richtet sich nach der Uhr des Servers. Steht sie auf UTC, läuft eine für 8 Uhr geplante Aufgabe in Deutschland um 9 oder 10 Uhr.
- Das Prozentzeichen: In der Crontab steht
%für einen Zeilenumbruch. In Befehlen wiedate +%Fmuss es mit einem Rückstrich geschrieben werden:\%. - Fehlender Zeilenumbruch am Ende: Die letzte Zeile muss mit einem Zeilenumbruch enden. Fehlt er, ignorieren manche Versionen von Cron die Zeile oder weisen die Crontab zurück.
- Keine Ausgabe: Ohne Umleitung gehen Fehlermeldungen verloren oder landen in einem Postfach, das niemand liest. Leiten Sie die Ausgabe in eine Datei um:
>> /var/log/aufgabe.log 2>&1. - Überlappende Läufe: Dauert eine Aufgabe länger als ihr Abstand, laufen mehrere Kopien gleichzeitig. Das Programm
flockverhindert das.
Ob Cron die Aufgabe überhaupt gestartet hat, zeigt das Systemprotokoll. Je nach System hilft grep CRON /var/log/syslog oder journalctl -u cron. Ob der Dienst läuft, zeigt systemctl status cron, auf manchen Systemen heißt er crond.
Alternativen zu Cron
Cron ist seit Jahrzehnten der Standard, aber nicht in jedem Fall die beste Wahl:
- systemd-Timer: auf modernen Linux-Systemen vorhanden. Sie können verpasste Läufe nachholen, Aufgaben voneinander abhängig machen und protokollieren von selbst.
- anacron: für Rechner, die nicht durchgehend laufen. Verpasste tägliche oder wöchentliche Aufgaben werden nachgeholt.
- Windows-Aufgabenplanung: das Gegenstück auf Windows-Servern.
- Dienste in der Cloud: etwa Cloud Scheduler bei Google, EventBridge bei AWS oder CronJobs in Kubernetes. Sie verwenden dieselbe oder eine sehr ähnliche Schreibweise. EventBridge etwa arbeitet mit sechs Feldern, das sechste steht für das Jahr.
- Externe Cron-Dienste: rufen in festen Abständen eine Adresse Ihrer Website auf. Sinnvoll, wenn das Hosting keine eigenen Cronjobs erlaubt.
Die Cron-Schreibweise begegnet Ihnen auch außerhalb von Servern, etwa bei geplanten Abläufen in GitHub Actions oder bei geplanten Abfragen in Datenbanken. Wer die fünf Felder einmal verstanden hat, kann sie überall lesen.
Ihr Feed, Ihre Sitemap oder Ihre WordPress-Aufgaben laufen nicht zuverlässig? Dann kontaktieren Sie uns gerne oder lesen Sie mehr über unser technisches SEO!
