Table des matières
Planification de tâches avec Cron
Le démon Cron (Command Run On) est le planificateur de tâches standard sous Debian [Chapter 2, 2.7.3]. Il permet d'exécuter automatiquement des scripts ou des commandes à des heures, jours ou intervalles réguliers en arrière-plan.
1. Architecture et concepts de base
Le système repose sur deux éléments principaux :
- Le démon
cron: Un service système qui tourne en permanence et vérifie chaque minute si une tâche doit être exécutée. - La
crontab(Cron Table) : Un fichier texte contenant la liste des tâches à exécuter et leurs horaires.
Les deux types de crontab
- La Crontab Utilisateur : Chaque utilisateur (y compris
pseudo_utilisateurouroot) possède sa propre crontab. Les tâches s'exécutent avec les privilèges de cet utilisateur. - La Crontab Système : Située dans /etc/crontab, elle est réservée à l'administrateur et nécessite de spécifier explicitement l'utilisateur qui lancera la commande [Chapter 2, 2.7.3].
2. La syntaxe Cron (Les 5 étoiles)
Chaque ligne d'une crontab utilisateur suit une syntaxe stricte basée sur 5 champs temporels suivis de la commande :
.---------------- minute (0 - 59) | .------------- heure (0 - 23) | | .---------- jour du mois (1 - 31) | | | .------- mois (1 - 12) | | | | .---- jour de la semaine (0 - 7) (0 et 7 sont le dimanche) | | | | | * * * * * /chemin/vers/la/commande
Les opérateurs spéciaux
*(Astérisque) : Toutes les valeurs possibles (ex: un*dans le champ mois signifie “chaque mois”).,(Virgule) : Liste de valeurs spécifiques (ex:1,3,5dans le champ jour signifie “le 1er, le 3 et le 5”).-(Tiret) : Plage de valeurs (ex:1-5dans le champ jour de la semaine signifie “du lundi au vendredi”)./(Slash) : Intervalle ou répétition (ex:*/15dans le champ minute signifie “toutes les 15 minutes”).
Les raccourcis alias
Cron propose des alias simplifiés pour remplacer les 5 étoiles :
@reboot: Exécute la commande une seule fois au démarrage de la machine.@dailyou@midnight: Une fois par jour (équivalent à0 0 * * *).@weekly: Une fois par semaine (équivalent à0 0 * * 0).@monthly: Une fois par mois (équivalent à0 0 1 * *).
3. Manipuler la Crontab
On ne modifie jamais les fichiers de cron directement dans /var/spool/cron/. On utilise impérativement la commande dédiée pour éviter de corrompre la base [Chapter 2, 2.1.3].
Commandes pour l'utilisateur courant
- Éditer la crontab :
crontab -e(Ouvre l'éditeur par défaut, ex: Nano ou Vim). - Afficher la crontab :
crontab -l(Affiche le contenu à l'écran sans le modifier). - Supprimer la crontab :
crontab -r(Attention, supprime toutes vos tâches sans confirmation).
Commandes pour l'administrateur (Root)
Pour modifier la crontab d'un autre utilisateur (par exemple pour planifier une tâche sur le compte de pseudo_utilisateur) :
sudo crontab -u pseudo_utilisateur -e
4. Les dossiers Cron automatiques
Debian propose une alternative très pratique aux lignes de commande complexes [Chapter 2, 2.7.3]. Il suffit de déposer un script exécutable dans l'un des dossiers suivants pour qu'il soit pris en charge automatiquement :
- /etc/cron.hourly/ : Les scripts y sont exécutés toutes les heures.
- /etc/cron.daily/ : Les scripts y sont exécutés une fois par jour [Chapter 2, 2.7.3].
- /etc/cron.weekly/ : Les scripts y sont exécutés une fois par semaine.
- /etc/cron.monthly/ : Les scripts y sont exécutés une fois par mois.
⚠️ Règle d'or : Les scripts déposés dans ces dossiers doivent être exécutables (chmod +x) et leur nom ne doit pas contenir de point (script est valide, script.sh sera ignoré par l'outil run-parts qui gère ces dossiers).
5. Bonnes pratiques et pièges courants
1. Utiliser des chemins absolus
Le piège le plus fréquent est que Cron s'exécute avec un environnement réseau et un $PATH extrêmement restreints. Il ne sait pas où se trouvent vos commandes.
- ❌ Mauvais :
rsync -av /src /dest(Cron risque de ne pas trouverrsync). - Bon :
/usr/bin/rsync -av /src /dest(On indique le chemin absolu).
2. Gérer les sorties (Redirections)
Par défaut, si une tâche produit du texte à l'écran ou génère une erreur, Cron tente d'envoyer un mail local à l'utilisateur. Pour éviter d'encombrer le système de fichiers, redirigez les sorties :
- Rediriger les erreurs dans un fichier log :
0 2 * * * /home/pseudo_utilisateur/bin/script.sh > /var/log/mon_script.log 2>&1
- Rendre la tâche totalement silencieuse (destruction des messages) :
0 2 * * * /home/pseudo_utilisateur/bin/script.sh > /dev/null 2>&1
6. Exemple d'application : Suivi de mise à jour de Tealdeer
Pour mettre en pratique ces concepts, voici un cas concret permettant de surveiller le cache de tealdeer (la commande tldr) [Chapter 2, 2.1.1]. L'objectif est de vérifier toutes les heures si l'index local a été actualisé au cours de la journée actuelle.
Étape A : Planification dans Cron
Ouvrez la crontab de l'utilisateur (crontab -e) et ajoutez la ligne suivante tout à la fin pour exécuter la vérification toutes les heures à la minute 0 :
0 * * * * /bin/bash /home/pseudo_utilisateur/bin/check_tldr.sh
Étape B : Source du script de vérification
Enregistrez le code suivant dans le fichier /home/pseudo_utilisateur/bin/check_tldr.sh et rendez-le exécutable (chmod +x) :
#!/bin/bash
# Chemin vers le fichier d'index du cache tealdeer
CACHE_FILE="$HOME/.cache/tealdeer/tldr-pages/index.json"
LOG_FILE="$HOME/.cache/tealdeer/check_status.log"
if [ ! -f "$CACHE_FILE" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Cache inexistant. Lancement requis : tldr --update" >> "$LOG_FILE"
exit 1
fi
# Récupération de la date de modification du fichier (format YYYY-MM-DD)
FILE_DATE=$(date -r "$CACHE_FILE" +%Y-%m-%d)
TODAY=$(date +%Y-%m-%d)
# Comparaison avec la date d'aujourd'hui
if [ "$FILE_DATE" == "$TODAY" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Succès : Le cache Tealdeer a bien été actualisé aujourd'hui ($FILE_DATE)." >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - Attention : Le cache n'a pas bougé aujourd'hui (Dernière maj : $FILE_DATE)." >> "$LOG_FILE"
fi
