Aller au contenu
Administration Linux medium

Planifier des tâches avec cron et crontab sous Linux

12 min de lecture

cron est le planificateur de tâches historique de Linux. Il exécute des commandes à des intervalles définis — toutes les minutes, chaque jour à 3 h, chaque lundi — selon une syntaxe à 5 champs. C’est l’outil de base pour automatiser les sauvegardes, le nettoyage de fichiers, les synchronisations et toute opération récurrente sur un serveur.

  • Comprendre le fonctionnement du démon cron et ses fichiers de configuration
  • Lire et écrire la syntaxe à 5 champs d’une ligne crontab
  • Créer, modifier et supprimer des crontabs utilisateur avec crontab -e
  • Utiliser les répertoires système /etc/cron.d/, /etc/cron.daily/ etc.
  • Diagnostiquer une tâche cron qui ne s’exécute pas
  • Appliquer les bonnes pratiques de sécurité et de fiabilité

cron intervient dès qu’une action doit se répéter automatiquement sur un système Linux :

  • Sauvegarder une base de données ou un répertoire chaque nuit
  • Nettoyer les fichiers temporaires ou les logs obsolètes
  • Synchroniser des données entre serveurs avec rsync
  • Renouveler un certificat Let’s Encrypt
  • Envoyer un rapport par e-mail chaque semaine
  • Vérifier l’espace disque et alerter si un seuil est dépassé

Le démon cron (crond sur Red Hat, cron sur Debian/Ubuntu) tourne en permanence. Chaque minute, il vérifie :

  1. Les crontabs utilisateur — éditées avec crontab -e, stockées dans /var/spool/cron/crontabs/
  2. Le fichier /etc/crontab — la crontab système
  3. Les fichiers dans /etc/cron.d/ — des crontabs supplémentaires déposées par les paquets
  4. Les répertoires /etc/cron.{hourly,daily,weekly,monthly}/ — des scripts exécutés par run-parts
Fenêtre de terminal
# Debian/Ubuntu
systemctl status cron
# RHEL/Fedora/Rocky/Alma
systemctl status crond
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running)

Chaque ligne d’une crontab suit ce format :

┌───────────── minute (0-59)
│ ┌───────────── heure (0-23)
│ │ ┌───────────── jour du mois (1-31)
│ │ │ ┌───────────── mois (1-12)
│ │ │ │ ┌───────────── jour de la semaine (0-7, 0 et 7 = dimanche)
│ │ │ │ │
* * * * * commande à exécuter
OpérateurSignificationExemple
*Toutes les valeurs* * * * * = chaque minute
,Liste de valeurs1,15 * * * * = aux minutes 1 et 15
-Plage1-5 * * * * = minutes 1 à 5
/Pas (intervalle)*/10 * * * * = toutes les 10 minutes
ExpressionSignification
0 3 * * *Chaque jour à 3 h 00
30 8 * * 1-5Du lundi au vendredi à 8 h 30
0 */2 * * *Toutes les 2 heures (à minute 0)
0 0 1 * *Le 1er de chaque mois à minuit
*/5 * * * *Toutes les 5 minutes
0 22 * * 0Chaque dimanche à 22 h

cron reconnaît aussi des raccourcis qui remplacent les 5 champs :

RaccourciÉquivalentSignification
@rebootAu démarrage du système
@hourly0 * * * *Chaque heure
@daily0 0 * * *Chaque jour à minuit
@weekly0 0 * * 0Chaque dimanche à minuit
@monthly0 0 1 * *Le 1er du mois à minuit
@yearly0 0 1 1 *Le 1er janvier à minuit
Fenêtre de terminal
crontab -e

L’éditeur par défaut s’ouvre (défini par $EDITOR ou $VISUAL). Ajoutez vos lignes et sauvegardez.

Fenêtre de terminal
crontab -l
Fenêtre de terminal
crontab -r

Éditer la crontab d’un autre utilisateur (root)

Section intitulée « Éditer la crontab d’un autre utilisateur (root) »
Fenêtre de terminal
sudo crontab -u www-data -e

La crontab système contient un champ utilisateur supplémentaire :

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6 1 * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly

Ce répertoire accueille des fichiers au format crontab (avec champ utilisateur). Les paquets y déposent leurs tâches planifiées :

Fenêtre de terminal
ls /etc/cron.d/
e2scrub_all popularity-contest sysstat

Les scripts placés dans ces répertoires sont exécutés automatiquement par run-parts :

RépertoireFréquence
/etc/cron.hourly/Chaque heure
/etc/cron.daily/Chaque jour
/etc/cron.weekly/Chaque semaine
/etc/cron.monthly/Chaque mois

cron exécute les commandes dans un environnement minimal. Le PATH est réduit, les variables de votre shell interactif ne sont pas disponibles.

Fenêtre de terminal
# Définir des variables en haut de la crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com
# La commande utilise le PATH complet
0 3 * * * /usr/local/bin/backup.sh
VariableEffet
SHELLShell utilisé pour exécuter les commandes
PATHRépertoires de recherche des commandes
MAILTODestinataire des sorties (vide = pas d’e-mail)
HOMERépertoire de travail (par défaut celui de l’utilisateur)

Deux fichiers contrôlent qui peut utiliser cron :

FichierEffet
/etc/cron.allowSi ce fichier existe, seuls les utilisateurs listés peuvent utiliser cron
/etc/cron.denyLes utilisateurs listés sont interdits (ignoré si cron.allow existe)

Si aucun des deux fichiers n’existe, le comportement dépend de la distribution :

  • Debian/Ubuntu : tous les utilisateurs peuvent utiliser cron
  • Red Hat/Rocky : seul root peut utiliser cron

Par défaut, cron envoie la sortie standard et d’erreur par e-mail (via MAILTO). Pour rediriger vers un fichier ou supprimer la sortie :

Fenêtre de terminal
# Rediriger stdout et stderr vers un fichier log
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# Supprimer toute sortie
0 3 * * * /usr/local/bin/backup.sh > /dev/null 2>&1
# Rediriger stderr uniquement vers un fichier
0 3 * * * /usr/local/bin/backup.sh 2>> /var/log/backup-errors.log
Fenêtre de terminal
# Sauvegarde de /home chaque nuit à 2 h 30
30 2 * * * /usr/bin/tar czf /backup/home-$(date +\%Y\%m\%d).tar.gz /home
Fenêtre de terminal
# Supprimer les fichiers de plus de 7 jours dans /tmp chaque jour à 4 h
0 4 * * * /usr/bin/find /tmp -type f -mtime +7 -delete
Fenêtre de terminal
# Alerte si le disque dépasse 90 % — chaque heure
0 * * * * df -h / | awk 'NR==2 && int($5)>90 {print "ALERTE disque : "$5}' | mail -s "Disque plein" admin@example.com
SymptômeCause probableSolution
Tâche ne s’exécute pasPATH insuffisantUtiliser des chemins absolus ou définir PATH en haut de la crontab
date affiche %Y%m%d% non échappéRemplacer % par \% dans la crontab
Aucune sortie visibleSortie non redirigéeAjouter >> /var/log/tache.log 2>&1
Permission deniedScript non exécutablechmod +x /chemin/du/script.sh
Tâche ne tourne pas (utilisateur)Bloqué par cron.denyVérifier /etc/cron.allow et /etc/cron.deny
Service cron inactifDémon arrêtésudo systemctl enable --now cron (Debian/Ubuntu) ou sudo systemctl enable --now crond (RHEL-like)
Script fonctionne en CLI mais pas dans cronVariables d’environnement manquantesDéfinir SHELL, PATH, HOME en haut de la crontab
Fenêtre de terminal
# Debian/Ubuntu
journalctl -u cron --since "1 hour ago"
# RHEL/Fedora/Rocky/Alma
journalctl -u crond --since "1 hour ago"
# Debian/Ubuntu (rsyslog)
grep CRON /var/log/syslog | tail -20
# RHEL-like (fichier dédié)
grep CROND /var/log/cron | tail -20
  • Chemins absolus partout — ne pas supposer un PATH complet
  • Gérer les sorties — rediriger vers un fichier log ou configurer MAILTO
  • Échapper le % dans les crontabs — toujours \%
  • Commenter les lignes — expliquer chaque tâche avec #
  • Tester manuellement avant d’ajouter une tâche — exécuter la commande en tant que l’utilisateur cron
  • Verrouiller les tâches longues — utiliser flock pour éviter les exécutions parallèles :
Fenêtre de terminal
# Empêcher les exécutions concurrentes avec flock
*/5 * * * * /usr/bin/flock -n /tmp/backup.lock /usr/local/bin/backup.sh
  • Limiter l’accès — utiliser /etc/cron.allow pour n’autoriser que les utilisateurs légitimes
  • cron exécute des tâches à intervalles réguliers selon une syntaxe à 5 champs (minute, heure, jour, mois, jour de semaine)
  • crontab -e édite la crontab de l’utilisateur courant, crontab -l l’affiche, crontab -r la supprime
  • Les commandes cron s’exécutent dans un environnement minimal — toujours utiliser des chemins absolus
  • Le % doit être échappé en \% dans les crontabs
  • /etc/cron.d/ et /etc/cron.{daily,weekly,monthly}/ servent aux tâches système
  • /etc/cron.allow et /etc/cron.deny contrôlent l’accès à cron
  • Toujours gérer les sorties (redirection ou MAILTO) et verrouiller les tâches longues avec flock

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn