Cronjob läuft nicht? Fehlersuche Schritt für Schritt
Ein Cronjob, der nicht läuft, fällt oft erst Tage später auf. Die Ursachen sind dabei fast immer dieselben. Diese Seite geht sie der Reihe nach durch, getrennt nach den zwei Wegen, auf denen ein Cronjob gestartet wird.
Weg 1
Cron auf dem eigenen Server
Noch gar nicht eingerichtet? So geht es: Cronjob unter Linux einrichten.
1. Läuft der Cron-Dienst überhaupt?
Auf den meisten Linux-Systemen heißt er cron, auf manchen crond. Steht dort nicht „active (running)“, startet gar kein Job.
systemctl status cron
2. Steht der Eintrag in der richtigen Crontab?
Jeder Benutzer hat seine eigene Crontab. Ein Eintrag, den Sie als root angelegt haben, sehen Sie als normaler Benutzer nicht, und umgekehrt. Außerdem braucht die letzte Zeile einen Zeilenumbruch, sonst wird sie ignoriert.
crontab -l sudo crontab -l -u www-data
3. Findet der Job seine Programme?
Das ist die häufigste Ursache überhaupt. Cron startet mit einer fast leeren Umgebung: ein kurzer PATH, kein .bashrc, ein anderes Arbeitsverzeichnis. Was im Terminal funktioniert, scheitert im Cron. Schreiben Sie deshalb alle Pfade vollständig aus, auch den zu php.
*/5 * * * * /usr/bin/php /var/www/projekt/cron.php
4. Sehen Sie sich die Ausgabe an
Fehlermeldungen landen sonst im Nichts. Leiten Sie beides, Ausgabe und Fehler, vorübergehend in eine Datei um. Nach dem nächsten Lauf steht dort, woran es scheitert.
*/5 * * * * /usr/bin/php /var/www/projekt/cron.php >> /tmp/cron.log 2>&1
5. Prozentzeichen maskieren
In der Crontab bedeutet % einen Zeilenumbruch. Ein Befehl wie date +%Y-%m-%d bricht deshalb mitten im Befehl ab. Schreiben Sie \%, oder legen Sie den Befehl in ein eigenes Skript.
6. Zeitzone und Uhrzeit prüfen
Cron rechnet in der Zeitzone des Servers. Steht der auf UTC, läuft ein Job für 3 Uhr im Sommer um 5 Uhr deutscher Zeit. date zeigt, welche Zeit der Server hat. Wie Sie einen Zeitplan richtig schreiben, steht in der Crontab-Referenz.
Damit Sie es künftig merken, wenn ein Cronjob ausfällt: Mit einem Heartbeat meldet er sich nach jedem Lauf kurz bei uns, und bleibt die Meldung aus, sagen wir Ihnen Bescheid. Cronjob überwachen
Weg 2
Aufruf einer Adresse von außen
Ein Dienst wie Cronjob.de ruft Ihr Skript über eine Adresse auf. Der wichtigste Hinweis ist dann der HTTP-Statuscode, den Ihr Server zurückgibt. Sie finden ihn im Aufrufprotokoll des Cronjobs, zusammen mit der Laufzeit und dem Anfang der Antwort. Welche Fehler wie oft vorkommen, zeigt unsere Auswertung unserer Aufrufdaten.
| Code | Bedeutet | Was zu tun ist |
|---|---|---|
| 401 | Anmeldung verlangt | Vor dem Skript liegt ein Verzeichnisschutz. Hinterlegen Sie Benutzername und Passwort im Cronjob, oder nehmen Sie den Pfad aus dem Schutz heraus. |
| 403 | Zugriff verweigert | Fast immer eine Firewall, ein Sicherheits-Plugin oder ein Botschutz des Hosters, nicht Ihr Skript. Unsere Aufrufe tragen den User-Agent Cronjob.de; bitten Sie Ihren Hoster, dafür eine Ausnahme einzurichten. Prüfen Sie auch, ob Ihr eigenes Skript bei falschem Schlüssel 403 zurückgibt. |
| 403 / 429 / 503 | Sicherheitsabfrage eines Schutzdienstes | Cloudflare, Sucuri und ähnliche Dienste halten automatische Aufrufe mit einer Prüfseite auf („Just a moment …“). Ihr Skript läuft dann gar nicht erst. Das Aufrufprotokoll nennt den Dienst. Richten Sie dort eine Ausnahme für die Adresse des Cronjobs ein, bei Cloudflare mit einer WAF-Regel mit der Aktion „Skip“. Den „Bot Fight Mode“ von Cloudflare umgeht keine Regel, er muss dafür aus. |
| 404 | Adresse nicht gefunden | Tippfehler in der Adresse, die Datei liegt woanders, oder eine Weiterleitung führt ins Leere. Rufen Sie die Adresse genau so im Browser auf, wie sie im Cronjob steht, auch mit oder ohne www. |
| 500 | Fehler im Skript | Ihr Skript ist abgestürzt. Die Ursache steht im Fehlerprotokoll des Webservers oder von PHP, meist in der Verwaltung Ihres Hosters unter „Logs“. Häufig: ein fehlender Pfad, weil das Skript beim Aufruf von außen in einem anderen Verzeichnis startet. |
| 502 / 503 / 504 | Server überlastet oder zu langsam | Der Webserver oder ein vorgeschalteter Dienst hat nicht rechtzeitig geantwortet. Tritt das nur zu bestimmten Uhrzeiten auf, laufen dann zu viele Aufgaben gleichzeitig. Verschieben Sie den Job auf eine ruhigere Minute oder teilen Sie die Arbeit auf. |
Das Skript braucht zu lange
Kein Aufrufer wartet unbegrenzt. Bei Cronjob.de sind es 45 Sekunden im kostenlosen Tarif und 60 Sekunden in den bezahlten, danach legen wir auf. Steht im Protokoll eine Laufzeit genau an dieser Grenze, war das der Grund. Teilen Sie die Arbeit in kleinere Häppchen auf, die dafür öfter laufen. Mit ignore_user_abort(true) arbeitet ein PHP-Skript bei den meisten Hostern auch nach dem Auflegen weiter, bis deren eigenes Zeitlimit greift.
Weiterleitungen
Wir folgen Weiterleitungen, etwa von http auf https oder auf www. Bei POST-Aufrufen ist das heikel: Je nach Art der Weiterleitung kommen Methode und mitgeschickte Daten nicht unverändert am Ziel an. Tragen Sie deshalb gleich die endgültige Adresse ein.
Die Adresse ist gar nicht von außen erreichbar
Adressen wie localhost, 127.0.0.1 oder 192.168.… gibt es nur in Ihrem eigenen Netz. Ein Dienst im Internet kann sie nicht aufrufen, Cronjob.de nimmt sie deshalb gar nicht erst an. Dasselbe gilt für eine Seite, die nur im Firmennetz oder hinter einem VPN liegt.
Der tückischste Fall
Läuft, tut aber nichts
Das Protokoll zeigt Erfolg, aber die Aufgabe wird nicht erledigt. Dann lohnt ein Blick auf die Antwort selbst.
Es kommt eine zwischengespeicherte Seite zurück
Ein Seiten-Cache oder ein vorgeschaltetes Netzwerk wie Cloudflare liefert eine gespeicherte Kopie aus, ohne dass Ihr Skript überhaupt startet. Nehmen Sie die Cron-Adresse vom Caching aus. Eine Laufzeit von wenigen Millisekunden ist ein deutlicher Hinweis darauf.
Es kommt eine Anmeldeseite zurück
Liefert die Adresse statt Ihrer Ausgabe das Anmeldeformular Ihres Systems, ist der Status trotzdem 200. Der Aufruf braucht dann einen Schlüssel in der Adresse oder eine Anmeldung per Benutzername und Passwort.
Das Skript bricht still ab
Geben Sie am Ende des Skripts ein festes Wort aus, zum Beispiel OK. Steht es in der Antwort, ist das Skript bis zum Schluss gelaufen. Fehlt es, hat es vorher aufgehört, und die Antwort davor zeigt meist, wo.
Der Job läuft doppelt
Dauert ein Lauf länger als der Abstand bis zum nächsten, laufen zwei gleichzeitig, und Mails gehen doppelt raus. Eine Sperre am Anfang des Skripts verhindert das: beim Start eine Datei anlegen, am Ende löschen, und nicht starten, solange sie existiert.
Sehen, was bei jedem Lauf passiert
Cronjob.de protokolliert jeden Aufruf mit Status, Laufzeit und dem Anfang der Antwort und schickt Ihnen auf Wunsch eine Mail, wenn ein Aufruf fehlschlägt. Fünf Cronjobs sind dauerhaft kostenlos.
Kostenlos starten Funktionen ansehen