o

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

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.

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.

Code Bedeutet Was zu tun ist
401Anmeldung verlangtVor dem Skript liegt ein Verzeichnisschutz. Hinterlegen Sie Benutzername und Passwort im Cronjob, oder nehmen Sie den Pfad aus dem Schutz heraus.
403Zugriff verweigertFast 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.
404Adresse nicht gefundenTippfehler 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.
500Fehler im SkriptIhr 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 / 504Server überlastet oder zu langsamDer 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