Polarys

Scripts shell

Planifier des tâches avec cron

Planifier des tâches avec cron

Les scripts que vous avez appris à écrire ne servent vraiment que s'ils tournent automatiquement. cron est le planificateur de tâches Linux : l'équivalent du Planificateur de tâches Windows, mais en texte. Sauvegardes nocturnes, rapports hebdomadaires, nettoyage de logs : tout cela se configure en une ligne.

La syntaxe cron

Chaque ligne d'un crontab (fichier de tâches cron) suit ce format :

┌──────────── minute (0-59)
│  ┌─────────── heure (0-23)
│  │  ┌──────────── jour du mois (1-31)
│  │  │  ┌─────────── mois (1-12)
│  │  │  │  ┌──────────── jour de la semaine (0=dimanche, 6=samedi)
│  │  │  │  │
*  *  *  *  *  commande
ExpressionSignification
*Toutes les valeurs
*/5Toutes les 5 unités
0 3 * * *Tous les jours à 3h00
0 3 * * 0Tous les dimanches à 3h00
30 2 1 * *Le 1er de chaque mois à 2h30
*/15 * * * *Toutes les 15 minutes
0 */6 * * *Toutes les 6 heures

Éditer le crontab

crontab -e    # édite le crontab de l'utilisateur courant
crontab -l    # liste les tâches actuelles
crontab -r    # SUPPRIME tout le crontab (attention !)
sudo crontab -e -u alice  # édite le crontab d'alice

Exemples concrets en PME

# Sauvegarde de la base GLPI tous les jours à 2h00
0 2 * * * mysqldump -u glpi -pMotDePasse glpi > /opt/backups/glpi-$(date +\%Y\%m\%d).sql

# Nettoyage des logs de plus de 30 jours, tous les dimanches à 3h
0 3 * * 0 find /var/log/glpi -mtime +30 -name "*.log" -delete

# Rapport d'espace disque tous les jours à 8h, envoyé par mail
0 8 * * * df -h > /tmp/disk-report.txt && mail -s "Disque $(hostname)" admin@entreprise.fr < /tmp/disk-report.txt

# Redémarrage du service GLPI tous les lundis à 4h (maintenance)
0 4 * * 1 systemctl restart apache2 php8.2-fpm

# Vérification des services toutes les 5 minutes
*/5 * * * * /opt/scripts/check-services.sh >> /var/log/check-services.log 2>&1

Bonnes pratiques

# 1. Toujours rediriger les sorties (cron n'affiche rien)
*/5 * * * * /opt/scripts/mon-script.sh >> /var/log/mon-script.log 2>&1

# 2. Utiliser des chemins absolus (cron n'a pas votre $PATH)
0 3 * * * /usr/bin/mysqldump -u glpi ...  # PAS juste mysqldump

# 3. Tester le script manuellement avant de le mettre en cron
bash /opt/scripts/mon-script.sh

# 4. Vérifier que cron tourne
systemctl status cron

Fichiers cron système

En dehors du crontab utilisateur, Linux dispose de dossiers pour les tâches système :

/etc/cron.daily/    → scripts exécutés chaque jour
/etc/cron.weekly/   → scripts exécutés chaque semaine
/etc/cron.monthly/  → scripts exécutés chaque mois
/etc/cron.d/        → fichiers crontab avec syntaxe complète
sequenceDiagram
  participant CRON as cron daemon
  participant SCRIPT as /opt/scripts/backup.sh
  participant DB as MariaDB
  participant LOG as /var/log/backup.log

  Note over CRON: 02:00 : déclenchement
  CRON->>SCRIPT: exécute le script
  SCRIPT->>DB: mysqldump glpi
  DB-->>SCRIPT: dump SQL
  SCRIPT->>LOG: journalise résultat
  SCRIPT-->>CRON: exit 0 (succès)

Erreurs fréquentes

  • Utiliser des chemins relatifs dans les scripts appelés par cron : cron n'a pas le même $PATH que votre shell interactif. Toujours utiliser /usr/bin/python3 plutôt que python3.
  • Oublier de rediriger les sorties : sans redirection, cron envoie la sortie par email (souvent non configuré) et vous ne voyez rien.
  • Utiliser % sans l'échapper dans crontab : le % est un caractère spécial dans crontab (saut de ligne). Écrivez \% dans les expressions date +\%Y\%m\%d.

À retenir

  • La syntaxe cron : minute heure jour-mois mois jour-semaine commande.
  • Toujours utiliser des chemins absolus et rediriger les sorties >> log 2>&1.
  • crontab -e pour éditer, crontab -l pour vérifier.

Mini-exercice

Ouvrez votre crontab avec crontab -e. Ajoutez une tâche qui écrit la date et l'heure dans /tmp/test-cron.log toutes les minutes : * * * * * date >> /tmp/test-cron.log. Attendez 2 minutes, puis vérifiez avec cat /tmp/test-cron.log.

Quiz de validation

Quiz - 8 questions

1. Dans la syntaxe cron, dans quel ordre apparaissent les champs de temps ?

2. Quelle expression cron déclenche une tâche tous les jours à 3h00 du matin ?

3. Pourquoi faut-il utiliser des chemins absolus (/usr/bin/mysqldump) plutôt que des noms courts (mysqldump) dans crontab ?

4. Quelle commande affiche les tâches cron de l'utilisateur courant sans les modifier ?

5. Quelle expression cron exécute une tâche toutes les 15 minutes ?

6. Une sauvegarde cron ne produit aucun fichier log et vous ne savez pas si elle s'est exécutée. Quelle est la cause probable ?

7. Quel dossier contient les scripts qui s'exécutent automatiquement chaque semaine sur Debian ?

8. Dans une entrée crontab, comment échapper le caractère % (nécessaire pour 'date +%Y%m%d') ?

Suis ta progression

Crée un compte gratuit pour suivre ta progression et accéder à toutes les leçons.