Dépannage · Hetzner

Tâche cron Hetzner qui ne s’exécute pas ? Voici comment la réparer

Une checklist pratique pour les tâches cron qui ne tournent pas sur un serveur Hetzner Cloud ou dédié — environnement, chemins, fuseau horaire et mail.

Si une tâche cron fonctionne à la main mais ne se déclenche jamais via crontab sur votre serveur Hetzner, c’est presque toujours l’une d’une poignée de causes. Parcourez cette liste.

1. Vérifiez que cron tourne vraiment

Sur une image Hetzner Cloud fraîche, le démon cron devrait être actif — mais vérifiez :

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

S’il est inactif, activez-le et démarrez-le :

sudo systemctl enable --now cron

2. Vérifiez que la tâche est dans la bonne crontab

Une tâche dans votre crontab utilisateur (crontab -e) tourne en tant que vous ; une tâche dans /etc/crontab ou /etc/cron.d/* doit inclure un champ utilisateur. Modifier la mauvaise est l’erreur la plus courante :

crontab -l            # les tâches de votre utilisateur
sudo crontab -l       # les tâches de root
cat /etc/cron.d/*     # les tâches système (nécessitent une colonne utilisateur)

3. Le PATH est minimal sous cron

Cron tourne avec un environnement réduit — typiquement PATH=/usr/bin:/bin. Un script qui appelle node, python3, docker ou pg_dump échouera avec « command not found » même s’il marche dans votre shell. Utilisez des chemins absolus, ou définissez PATH en haut de la crontab :

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

4. Les variables d’environnement manquent

Cron ne charge pas ~/.bashrc, ~/.profile ni /etc/environment comme le fait une connexion interactive. Les secrets et la configuration dont vous dépendez ne sont tout simplement pas là. Chargez-les explicitement :

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

5. Vérifiez le fuseau horaire du serveur

Les images Hetzner sont souvent en UTC par défaut. 0 9 * * * se déclenche alors à 09:00 UTC, pas à votre 09:00 locale. Vérifiez et, si besoin, définissez-le :

timedatectl                       # voir le fuseau actuel
sudo timedatectl set-timezone Europe/Paris

6. Lisez les journaux

Cron journalise chaque déclenchement. Si vous ne voyez pas votre tâche, c’est qu’elle ne correspond pas :

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

Aucune ligne de journal signifie généralement une expression de planning erronée ou la mauvaise crontab.

Le problème de fond : vous l’avez remarqué uniquement parce que vous avez regardé

Chaque correctif ci-dessus suppose que vous êtes allé voir. La tâche qui s’est arrêtée en silence il y a six semaines est celle qui fait mal. Cron n’a aucune notion de succès ou d’échec et ne vous dira pas quand il s’arrête.

Ajoutez un heartbeat : faites pinguer une URL par la tâche à la fin, et soyez alerté dès qu’un ping manque. Une ligne à la fin de votre script :

curl -fsS https://ping.steadycron.com/<votre-jeton-ping>