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.
Le système repose sur deux éléments principaux :
cron : Un service système qui tourne en permanence et vérifie chaque minute si une tâche doit être exécutée.crontab (Cron Table) : Un fichier texte contenant la liste des tâches à exécuter et leurs horaires.pseudo_utilisateur ou root) possède sa propre crontab. Les tâches s'exécutent avec les privilèges de cet utilisateur.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
* (Astérisque) : Toutes les valeurs possibles (ex: un * dans le champ mois signifie “chaque mois”)., (Virgule) : Liste de valeurs spécifiques (ex: 1,3,5 dans le champ jour signifie “le 1er, le 3 et le 5”).- (Tiret) : Plage de valeurs (ex: 1-5 dans le champ jour de la semaine signifie “du lundi au vendredi”)./ (Slash) : Intervalle ou répétition (ex: */15 dans le champ minute signifie “toutes les 15 minutes”).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.@daily ou @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 * *).
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].
crontab -e (Ouvre l'éditeur par défaut, ex: Nano ou Vim).crontab -l (Affiche le contenu à l'écran sans le modifier).crontab -r (Attention, supprime toutes vos tâches sans confirmation).
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
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 :
⚠️ 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).
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.
rsync -av /src /dest (Cron risque de ne pas trouver rsync)./usr/bin/rsync -av /src /dest (On indique le chemin absolu).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 :
0 2 * * * /home/pseudo_utilisateur/bin/script.sh > /var/log/mon_script.log 2>&1
0 2 * * * /home/pseudo_utilisateur/bin/script.sh > /dev/null 2>&1
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.
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
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