Fehlerbehebung · Hetzner

Hetzner-Cronjob läuft nicht? So beheben Sie es

Eine praktische Checkliste für Cronjobs, die auf einem Hetzner-Cloud-Server oder Dedicated-Server nicht laufen — Umgebung, Pfade, Zeitzone und Mail.

Wenn ein Cronjob von Hand funktioniert, aber per crontab auf Ihrem Hetzner-Server nie feuert, liegt es fast immer an einer Handvoll Ursachen. Arbeiten Sie diese Liste ab.

1. Prüfen Sie, ob Cron überhaupt läuft

Auf einem frischen Hetzner-Cloud-Image sollte der Cron-Daemon aktiv sein — aber prüfen Sie:

systemctl status cron      # Debian/Ubuntu
systemctl status crond     # CentOS/Rocky/Alma

Ist er inaktiv, aktivieren und starten Sie ihn:

sudo systemctl enable --now cron

2. Prüfen Sie, ob der Job in der richtigen Crontab steht

Ein Job in Ihrer Benutzer-Crontab (crontab -e) läuft als Sie; ein Job in /etc/crontab oder /etc/cron.d/* muss ein Benutzerfeld enthalten. Die falsche zu bearbeiten ist der häufigste Fehler:

crontab -l            # Jobs Ihres Benutzers
sudo crontab -l       # Jobs von root
cat /etc/cron.d/*     # System-Jobs (benötigen eine Benutzerspalte)

3. Der PATH ist unter Cron minimal

Cron läuft mit einer kargen Umgebung — typisch PATH=/usr/bin:/bin. Ein Skript, das node, python3, docker oder pg_dump aufruft, scheitert mit „command not found“, obwohl es in Ihrer Shell funktioniert. Verwenden Sie absolute Pfade oder setzen Sie PATH am Anfang der Crontab:

PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /usr/local/bin/node /opt/app/job.js

4. Umgebungsvariablen fehlen

Cron lädt ~/.bashrc, ~/.profile oder /etc/environment nicht so wie ein interaktives Login. Secrets und Konfiguration, auf die Sie sich verlassen, sind einfach nicht da. Laden Sie sie explizit:

0 2 * * * . /opt/app/.env && /opt/app/run.sh

5. Prüfen Sie die Server-Zeitzone

Hetzner-Images stehen oft standardmäßig auf UTC. 0 9 * * * feuert dann um 09:00 UTC, nicht zu Ihrer lokalen 09:00. Prüfen und ggf. setzen:

timedatectl                       # aktuelle Zeitzone ansehen
sudo timedatectl set-timezone Europe/Berlin

6. Lesen Sie die Logs

Cron protokolliert jeden Feuervorgang. Sehen Sie Ihren Job nicht, passt er nicht:

grep CRON /var/log/syslog         # Debian/Ubuntu
journalctl -u cron --since today

Gar keine Log-Zeile bedeutet meist einen fehlerhaften Zeitplan-Ausdruck oder die falsche Crontab.

Das tiefere Problem: Sie haben es nur bemerkt, weil Sie nachgesehen haben

Jede obige Lösung setzt voraus, dass Sie nachgesehen haben. Der Job, der vor sechs Wochen still ausfiel, ist der, der wehtut. Cron hat kein Konzept von Erfolg oder Fehler und sagt Ihnen nicht, wenn er aufhört.

Fügen Sie einen Heartbeat hinzu: Lassen Sie den Job beim Abschluss eine URL anpingen und werden Sie alarmiert, sobald ein Ping ausbleibt. Eine Zeile am Ende Ihres Skripts:

curl -fsS https://ping.steadycron.com/<ihr-ping-token>