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
crontab -e # éditer les tâches de l'utilisateur courant
crontab -l # les afficher
sudo crontab -e -u www-data # celles d'un autre utilisateurLes cinq champs : minute, heure, jour du mois, mois, jour de la semaine
*/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 30Pourquoi 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.
0 3 * * * /usr/local/bin/sauvegarde.sh >> /var/log/sauvegarde.log 2>&1Vérifier que cron a bien tenté
grep CRON /var/log/syslog | tail -20Les 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
[Unit]
Description=Sauvegarde quotidienne
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=900
[Install]
WantedBy=timers.targetsudo systemctl enable --now sauvegarde.timer
systemctl list-timers # quand partent les prochaines
journalctl -u sauvegarde.serviceBloqué malgré tout ? Ouvrez un ticket : on répond en français, et on regarde votre machine si besoin.
Ouvrir un ticket