Skip to content

Planification avec cron sous Linux

cron est le service (daemon) qui exécute des tâches planifiées à des intervalles réguliers. Il permet d'automatiser des scripts: sauvegardes, rotations de logs, envoi de rapports, nettoyage de répertoires, etc.

Le principe

  • Le démon crond lit des tables de planification appelées "crontabs".
  • Chaque ligne d'une crontab décrit QUAND exécuter une COMMANDE.
  • Les crontabs système: /etc/crontab, /etc/cron.d/*, /etc/cron.daily/, /etc/cron.hourly/, etc.
  • Les crontabs utilisateur: stockées généralement dans /var/spool/cron/ et gérées via crontab -e.

Format d'une ligne crontab

Syntaxe générale (crontab utilisateur):

* * * * * commande
│ │ │ │ │
│ │ │ │ └── Jour de la semaine (0-7, dimanche=0 ou 7)
│ │ │ └──── Mois (1-12)
│ │ └────── Jour du mois (1-31)
│ └──────── Heure (0-23)
└────────── Minute (0-59)

Dans /etc/crontab et /etc/cron.d/ il y a un champ utilisateur supplémentaire:

* * * * * utilisateur commande

Valeurs possibles

  • Un nombre exact: 5 (exécute quand le champ == 5)
  • Une liste: 1,15,30
  • Une plage: 1-5
  • Avec pas (step): */10 (toutes les 10 unités), 1-30/2
  • Combinaisons: 1,5,10-20/3

Exemples

ExpressionSignification
0 2 * * *Tous les jours à 02:00
*/5 * * * *Toutes les 5 minutes
15 8-18 * * 1-5À :15 de chaque heure de 8h à 18h lundi→vendredi
0 0 1 * *Le 1er de chaque mois à minuit
30 23 * * 0,6Tous les dimanches et samedis à 23:30

Le site https://crontab.guru/ est très utile pour tester et comprendre les expressions cron.

Gestion des crontabs

Créer/éditer

bash
crontab -e          # édite votre crontab
crontab -l          # affiche
crontab -r          # supprime

Le premier lancement de crontab -e vous propose un éditeur (nano, vim...).

Exemple complet utilisateur

cron
# Sauvegarde de /home/user chaque jour à 01h30
30 1 * * * /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1

# Nettoyer /tmp toutes les 2 heures
0 */2 * * * /home/user/scripts/clean_tmp.sh > /dev/null 2>&1

# Rapport hebdomadaire dimanche 06h00
0 6 * * 0 /home/user/scripts/report.sh | mail -s "Rapport hebdo" admin@example.com

> /dev/null 2>&1 supprime toute sortie (stdout et stderr)

Dans /etc/crontab

cron
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# m h dom mon dow user command
0 1 * * * root /usr/local/sbin/rotate_logs.sh

Variables utiles

Dans une crontab système (/etc/crontab ou /etc/cron.d/app):

  • SHELL=/bin/bash
  • PATH=... (Cron impose souvent un PATH minimal)
  • MAILTO=user@example.com
  • MAILTO définit la destination des sorties non redirigées.
  • MAILTO=root envoie les courriels au superutilisateur.
  • MAILTO= vide désactive l'envoi.
  • HOME=/home/user

Les courriels sont visibles avec la commande mail ou dans /var/mail/root si mailutils est installé.

Bonne pratique: rediriger stdout/stderr pour conserver un log:

cron
0 2 * * * /usr/local/bin/backup_db.sh >> /var/log/backup_db.log 2>&1

Répertoires périodiques

Le paquet cron (ou anacron) exécute automatiquement les scripts placés dans:

/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

Les scripts doivent être exécutables et généralement sans extension.

anacron ré-exécute les tâches manquées (ex: machine éteinte la nuit) en différé.

Débogage et vérification

Journal

Consulter les logs:

bash
grep CRON /var/log/syslog      # Debian/Ubuntu
journalctl -u cron             # systemd cron
journalctl -t CRON             # tag CRON

Test manuel

Exécuter la commande directement dans un terminal pour vérifier PATH, permissions, dépendances.

Pièges fréquents

  • PATH réduit → commandes introuvables (mettre chemins absolus).
  • Variables d'environnement manquantes (exportez dans le script).
  • Scripts non exécutables (chmod +x).
  • Interpréteur manquant (ajoutez un shebang).
  • Sortie rédigée vers un fichier qui n'existe pas → erreur silencieuse.

Exercices

  1. Planifiez une tâche qui toutes les 15 minutes ajoute la sortie de df -h / dans $HOME/logs/disk_history.log 2>&1.
  1. Créez une entrée pour lancer une sauvegarde de /home/nom vers /srv/backups/home-$(date +\%F).tar.gz une fois par jour à minuit.
  1. Écrivez un script cleanup_old.sh qui supprime les fichiers de plus de 30 jours dans /var/tmp/app/ et planifiez-le chaque nuit à 01h20.

Quiz 🎯

Ce quiz couvre: syntaxe crontab et bonnes pratiques.

0 questions - Bonne chance !

.