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
| Expression | Signification |
|---|---|
* | Toutes les valeurs |
*/5 | Toutes les 5 unités |
0 3 * * * | Tous les jours à 3h00 |
0 3 * * 0 | Tous 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
$PATHque votre shell interactif. Toujours utiliser/usr/bin/python3plutôt quepython3. - 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 expressionsdate +\%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 -epour éditer,crontab -lpour 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.