Outils pour utilisateurs

Outils du site


article:service_cron

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
article/service_cron.txt · Dernière modification : de retestro