====== 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_utilisateur'' ou ''root'') 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,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"). ==== 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. * ''@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 * *''). ===== 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 trouver ''rsync''). * **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