SLBCloud
Intermédiaire7 min de lecture

Programmer une tâche récurrente

cron et les minuteurs systemd : écrire une planification juste, et surtout comprendre pourquoi elle ne se déclenche pas.

cron, en une ligne

bash
crontab -e        # éditer les tâches de l'utilisateur courant
crontab -l        # les afficher
sudo crontab -e -u www-data   # celles d'un autre utilisateur

Les cinq champs : minute, heure, jour du mois, mois, jour de la semaine

cron
*/5 * * * *   /usr/local/bin/verifier.sh        # toutes les 5 minutes
0 3 * * *     /usr/local/bin/sauvegarde.sh      # tous les jours à 3 h
0 4 * * 1     /usr/local/bin/hebdo.sh           # tous les lundis à 4 h
30 2 1 * *    /usr/local/bin/mensuel.sh         # le 1er du mois à 2 h 30

Pourquoi votre tâche ne part pas

Dans quasiment tous les cas, la cause est l'une des quatre suivantes. Elles se vérifient en deux minutes.

  • Le script n'est pas exécutable : chmod +x sur le fichier.
  • Le PATH de cron est minimal : écrivez les chemins complets, /usr/bin/php et non php.
  • Le script suppose un dossier courant : ajoutez un cd au début, cron démarre ailleurs.
  • Les variables d'environnement de votre session n'existent pas dans cron : chargez-les explicitement.

Capturer la sortie, sinon elle disparaît

Sans redirection, ce que le script affiche part dans un courriel local que personne ne lit. Redirigez vers un fichier : la prochaine fois que quelque chose cloche, vous aurez la réponse.

cron
0 3 * * * /usr/local/bin/sauvegarde.sh >> /var/log/sauvegarde.log 2>&1

Vérifier que cron a bien tenté

bash
grep CRON /var/log/syslog | tail -20

Les minuteurs systemd, pour aller plus loin

Un minuteur systemd est plus verbeux à écrire, mais il apporte trois choses que cron n'a pas : les journaux au même endroit que le reste, la reprise d'une exécution manquée pendant que la machine était éteinte, et un décalage aléatoire pour éviter que mille serveurs partent à la même seconde.

/etc/systemd/system/sauvegarde.timer

ini
[Unit]
Description=Sauvegarde quotidienne

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=900

[Install]
WantedBy=timers.target
bash
sudo systemctl enable --now sauvegarde.timer
systemctl list-timers          # quand partent les prochaines
journalctl -u sauvegarde.service

Bloqué malgré tout ? Ouvrez un ticket : on répond en français, et on regarde votre machine si besoin.

Ouvrir un ticket