o
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
Auf den meisten Linux-Systemen heißt er cron, auf manchen crond. Steht dort nicht „active (running)“, startet gar kein Job.
systemctl status cron
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
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
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
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.
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.
Weg 2
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.
| 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. |
| 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. |
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.
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.
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
Das Protokoll zeigt Erfolg, aber die Aufgabe wird nicht erledigt. Dann lohnt ein Blick auf die Antwort selbst.
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.
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.
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.
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.
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