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 :

Les deux types de crontab

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

Les raccourcis alias

Cron propose des alias simplifiés pour remplacer les 5 étoiles :

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

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 :

⚠️ 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.

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 :

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

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