15 - cron : les taches planifiees
Ce que tu vas apprendre
- Utiliser crontab pour créer et gerer des taches planifiees
- Maitriser la syntaxe cron (les cinq etoiles)
- Logger la sortie de tes taches cron
- Comparer cron et les timers systemd
- Utiliser at pour les taches ponctuelles et anacron pour les machines pas toujours allumees
Prerequisites
Savoir écrire des scripts bash et comprendre les bases de systemd.
Mon premier cron job, c'etait un script de backup qui tournait toutes les nuits. J'etais fier. Sauf que le script avait une erreur, la sortie allait nulle part, et j'ai découvert trois mois plus tard que je n'avais aucun backup. La leçon : un cron job sans logging, ca n'existe pas.
crontab : les bases
crontab est l'outil pour gerer les taches planifiees de l'utilisateur courant :
bash# Voir tes taches planifiees
crontab -l
# Editer tes taches
crontab -e
# Voir les taches d'un autre utilisateur (root seulement)
sudo crontab -l -u deploy
# Supprimer toutes tes taches (attention)
crontab -r
La syntaxe cron
Chaque ligne de crontab suit ce format :
# minute heure jour_du_mois mois jour_de_la_semaine commande
# (0-59) (0-23) (1-31) (1-12) (0-7, 0=7=dim)
# Tous les jours a 3h du matin
0 3 * * * /opt/scripts/backup.sh
# Toutes les 15 minutes
*/15 * * * * /opt/scripts/health-check.sh
# Du lundi au vendredi a 9h
0 9 * * 1-5 /opt/scripts/rapport.sh
# Le premier du mois a minuit
0 0 1 * * /opt/scripts/cleanup-mensuel.sh
# Toutes les heures, les jours de semaine
0 * * * 1-5 /opt/scripts/sync.sh
# Tous les dimanches a 2h30
30 2 * * 0 /opt/scripts/maintenance.sh
La syntaxe est compacte et un peu cryptique. Je ne la retiens jamais parfaitement, et c'est la que crontab.guru entre en jeu. Tu tapes ton expression et il te dit en anglais ce que ca fait. Indispensable.
Quelques raccourcis utiles :
@reboot /opt/scripts/startup.sh # Au demarrage
@hourly /opt/scripts/check.sh # Toutes les heures (0 * * * *)
@daily /opt/scripts/backup.sh # Tous les jours (0 0 * * *)
@weekly /opt/scripts/report.sh # Toutes les semaines (0 0 * * 0)
@monthly /opt/scripts/cleanup.sh # Tous les mois (0 0 1 * *)
Logger la sortie : la regle numero un
Par défaut, cron envoie la sortie par email. Si le mail n'est pas configure (et il ne l'est presque jamais), la sortie disparaît dans le neant. Redirige toujours vers un fichier :
bash# Rediriger stdout et stderr vers un fichier
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# Avec la date dans le log
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup-$(date +\%Y\%m\%d).log 2>&1
# Note : le % a un sens special dans crontab, il faut l'echapper avec \
Sur paltemps.fr, chaque cron job écrit dans un fichier de log dédié. Quand quelque chose ne marche pas, je sais exactement ou regarder.
Les pièges classiques de cron
Le PATH est minimal. Cron n'a pas le meme PATH que ton terminal. Si ton script utilise node ou bun, utilise le chemin complet :
bash# Ca risque de ne pas marcher
0 * * * * node /opt/scripts/check.js
# Ca marche
0 * * * * /usr/local/bin/node /opt/scripts/check.js
# Ou definis le PATH en haut du crontab
PATH=/usr/local/bin:/usr/bin:/bin
0 * * * * node /opt/scripts/check.js
Le répertoire de travail est ~. Si ton script depend de fichiers relatifs, utilise cd au début :
bash0 3 * * * cd /opt/mon-app && ./backup.sh >> /var/log/backup.log 2>&1
Les variables d'environnement ne sont pas chargees. .bashrc n'est pas lu. Si ton script a besoin de variables, définis-les dans le script ou dans le crontab.
cron vs systemd timers
On a vu les timers systemd dans un article précédent. Voici une comparaison honnete :
| Aspect | cron | systemd timers |
|---|---|---|
| Simplicite | Une ligne suffit | Deux fichiers (.service + .timer) |
| Logs | A gerer soi-meme | Integres dans journalctl |
| Historique | Aucun | Visible avec systemctl |
| Rattrapage | Non (sauf anacron) | Oui avec Persistent=true |
| Dépendances | Non | Oui (After=, Requires=) |
| Disponibilite | Partout | Uniquement avec systemd |
Mon avis : pour une tache simple (backup quotidien, cleanup), cron suffit. Pour une tache critique qui doit etre tracable et fiable, les timers systemd sont supérieurs.
at : les taches ponctuelles
at exécuté une commande une seule fois, a un moment precis. Utile pour les opérations ponctuelles :
bash# Installer si necessaire
sudo apt install at
# Executer une commande dans 30 minutes
echo "/opt/scripts/migration.sh" | at now + 30 minutes
# A une heure precise
echo "/opt/scripts/deploy.sh" | at 14:30
# Demain a 3h du matin
echo "/opt/scripts/cleanup.sh" | at 3:00 AM tomorrow
# Voir les taches en attente
atq
# Supprimer une tache par son numero
atrm 5
# Mode interactif
at 22:00
> /opt/scripts/backup.sh
> Ctrl+D
anacron : pour les machines pas toujours allumees
cron suppose que la machine tourne 24h/24. Si elle est eteinte au moment prevu, la tache ne s'exécuté pas. anacron resout ca : il lance les taches manquees au prochain démarrage.
bash# /etc/anacrontab
# periode delai(min) identifiant commande
1 5 backup /opt/scripts/backup.sh
7 10 cleanup /opt/scripts/weekly-cleanup.sh
30 15 rapport /opt/scripts/monthly-report.sh
La première colonne est la periodicite en jours. Le delai évité que tout se lance en meme temps au boot. anacron est surtout utile pour les laptops et les postes de travail.
Exemples concrets
bash# Backup de PostgreSQL tous les jours a 2h
0 2 * * * pg_dump -U deploy monapp | gzip > /opt/backups/db_$(date +\%Y\%m\%d).sql.gz 2>> /var/log/backup.log
# Nettoyage des logs de plus de 30 jours, chaque dimanche
0 4 * * 0 find /var/log/app -name "*.log" -mtime +30 -delete
# Verification du certificat SSL chaque lundi
0 9 * * 1 /opt/scripts/check-ssl.sh >> /var/log/ssl-check.log 2>&1
# Rotation des backups : garder les 7 derniers
0 3 * * * ls -t /opt/backups/db_*.sql.gz | tail -n +8 | xargs -r rm
# Surveillance disque : alerte si plus de 90%
*/30 * * * * /opt/scripts/disk-alert.sh
Le script de surveillance disque :
bash#!/usr/bin/env bash
set -euo pipefail
seuil=90
usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [[ "$usage" -gt "$seuil" ]]; then
echo "Alerte : disque a ${usage}% sur $(hostname)" | \
mail -s "Disque plein" admin@example.com
fi
Résumé
crontab -epour éditer,crontab -lpour lister- Utilise crontab.guru pour vérifier ta syntaxe
- Redirige toujours stdout et stderr vers un fichier de log
- Attention au PATH minimal et aux variables d'environnement dans cron
- Les timers systemd sont plus robustes pour les taches critiques
atpour les taches ponctuelles,anacronpour les machines intermittentes
Article précédent : Les scripts bash Article suivant : Les logs