Cron est le gestionnaire de tâches planifiées le plus utilisé sous Linux. Il permet d'automatiser l'exécution de commandes ou de scripts à des intervalles réguliers : chaque jour à minuit, chaque lundi à 8h, tous les 15 minutes… C'est un outil indispensable pour tout administrateur système ou utilisateur Linux avancé.
Sur les systèmes utilisant systemd, le service cron s'appelle généralement cron ou crond. Il tourne en arrière-plan et vérifie toutes les minutes s'il doit exécuter une tâche.
# Vérifier que cron tourne
systemctl status cron
# Le démarrer automatiquement au boot
systemctl enable cron
# Démarrer maintenant
systemctl start cron
# Redémarrer après modification
systemctl restart cronChaque 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| Caractère | Signification | Exemple |
|---|---|---|
* | N'importe quelle valeur | * * * * * = chaque minute |
, | Liste de valeurs | 1,15 * * * * = minutes 1 et 15 |
- | Plage de valeurs | 9-17 * * * * = de 9h à 17h |
/ | Périodicité (step) | */5 * * * * = toutes les 5 minutes |
# Toutes les minutes
* * * * * /opt/mon-script.sh
# Toutes les 5 minutes
*/5 * * * * /opt/mon-script.sh
# Toutes les heures (à la minute 0)
0 * * * * /opt/mon-script.sh
# Chaque jour à 3h du matin
0 3 * * * /opt/mon-script.sh
# Chaque lundi à 8h
0 8 * * 1 /opt/mon-script.sh
# Chaque 1er du mois à midi
0 12 1 * * /opt/mon-script.sh
# Du lundi au vendredi à 9h
0 9 * * 1-5 /opt/mon-script.sh
# Toutes les 30 minutes de 9h à 17h
*/30 9-17 * * * /opt/mon-script.sh
# Tous les 3 mois, le 15 du mois à 2h
0 2 15 */3 * /opt/mon-script.sh| Valeur | Jour |
|---|---|
0 | Dimanche |
1 | Lundi |
2 | Mardi |
3 | Mercredi |
4 | Jeudi |
5 | Vendredi |
6 | Samedi |
7 | Dimanche |
crontab -e ouvre l'éditeur pour modifier la crontab de l'utilisateur actuel :
# Éditer sa crontab
crontab -e
# Voir sa crontab sans éditer
crontab -l
# Supprimer toute la crontab (demande confirmation)
crontab -r
# Supprimer sans confirmation
crontab -r -iLa première utilisation de crontab -e demande de choisir un éditeur. nano est recommandé pour les débutants :
# Sélectionner nano par défaut
select-editor
# Ou forcer nano
EDITOR=nano crontab -eExemple de crontab avec commentaires et variables d'environnement :
# ┌── Variables d'environnement
# │
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=contact@hinni-swiss.com
# ┌── Backup quotidien à 3h
# │
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# ┌── Nettoyage des logs tous les dimanches à 4h
# │
0 4 * * 0 /opt/scripts/cleanup-logs.sh
# ┌── Surveillance toutes les 5 minutes
# │
*/5 * * * * /opt/scripts/check-services.shPar défaut, cron envoie la sortie par e-mail à l'utilisateur. Pour éviter cela ou rediriger ailleurs :
# Ne pas envoyer d'e-mail (rediriger vers /dev/null)
0 3 * * * /opt/scripts/backup.sh > /dev/null 2>&1
# Ajouter la date au log
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup_$(date +\%Y\%m\%d).log 2>&1
# Écrire un log propre avec horodatage
0 3 * * * /opt/scripts/backup.sh 2>&1 | logger -t backup
# Les erreurs seulement dans un fichier
0 3 * * * /opt/scripts/backup.sh 2>> /var/log/backup_errors.logIl existe aussi des crontabs système dans /etc/cron.d/ et /etc/cron.daily/, /etc/cron.hourly/, etc. :
# Emplacements système
/etc/crontab # Crontab principale du système
/etc/cron.d/ # Fichiers cron supplémentaires
/etc/cron.daily/ # Scripts exécutés quotidiennement
/etc/cron.hourly/ # Scripts exécutés chaque heure
/etc/cron.weekly/ # Scripts exécutés chaque semaine
/etc/cron.monthly/ # Scripts exécutés chaque mois
# Ajouter une tâche au système
sudo nano /etc/cron.d/mon-script
# Format complet (inclut l'utilisateur) :
# 0 3 * * * root /opt/scripts/backup.shOn peut autoriser ou interdire l'usage de cron par utilisateur :
# Autoriser certains utilisateurs
sudo nano /etc/cron.allow
# david
# marie
# Interdire certains utilisateurs
sudo nano /etc/cron.deny
# guest
# testuserQuelques tricks pour vérifier que cron fonctionne correctement :
# Voir les dernières entrées du journal systemd
journalctl -u cron -e
# Ou via syslog
grep CRON /var/log/syslog
# Lister les tâches cron actives
sudo systemctl status cron
# Simuler une exécution (tester avant de planifier)
run-parts /etc/cron.hourly --dry-runcron ne lance pas une tâche manquée si la machine était éteinte. anacron comble ce manque en exécutant les tâches en retard au prochain démarrage :
# Installer anacron
sudo apt install anacron
# Fichier de configuration
/etc/anacrontab
# Format :
# periode delai identifiant commande
# jours min nom script
1 5 daily /opt/scripts/backup.sh
7 10 weekly /opt/scripts/cleanup.shUn bon script lancé par cron doit être autonome (chemins absolus, gestion des erreurs) :
#!/bin/bash
# Script de backup — à planifier avec cron
DATE=$(date +\%Y\%m\%d_\%H\%M\%S)
SOURCE="/home/david/documents"
DEST="/backup/docs_\${DATE}.tar.gz"
LOG="/var/log/backup.log"
echo "[${DATE}] Début du backup" >> "${LOG}"
# Vérifier que la source existe
if [ ! -d "${SOURCE}" ]; then
echo "[${DATE}] ERREUR: Source ${SOURCE} introuvable" >> "${LOG}"
exit 1
fi
# Créer l'archive
tar -czf "${DEST}" "${SOURCE}" 2>> "${LOG}"
if [ $? -eq 0 ]; then
echo "[${DATE}] Backup réussi: ${DEST}" >> "${LOG}"
else
echo "[${DATE}] ERREUR lors du backup" >> "${LOG}"
exit 1
fi
echo "[${DATE}] Fin du backup" >> "${LOG}"minute heure jour_du_mois mois jour_de_la_semaine* = toute valeur, /n = toutes les n unités, - = plagecrontab -e = éditer la crontab de l'utilisateur courantcrontab -l = voir sa crontab, crontab -r = supprimer> fichier 2>&1/etc/cron.d/ = crontabs système, /etc/cron.hourly/ = scripts horairesanacron = exécution des tâches manquées au prochain boot