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>