Automatiser les taches repetitives est un element fondamental de l’administration de serveurs Linux. Que vous ayez besoin de sauvegardes nocturnes de bases de donnees, de rotation hebdomadaire des logs ou de verifications d’etat minute par minute, cron est le planificateur de taches base sur le temps qui gere tout cela. Il fait partie integrante des systemes de type Unix depuis les annees 1970, et chaque distribution Linux l’inclut.
Ce guide couvre tout, de la syntaxe de base de crontab aux techniques avancees comme la gestion des variables d’environnement, la journalisation de la sortie, les restrictions de securite et les modeles de planification concrets. A la fin, vous serez capable de planifier, deboguer et maintenir des cron jobs en toute confiance sur n’importe quel systeme Linux.
Prerequis
Avant de commencer, assurez-vous de disposer des elements suivants :
- Un systeme Linux (Ubuntu, Debian, CentOS, RHEL ou toute distribution)
- Un terminal avec acces shell (local ou SSH)
- Un compte utilisateur non root avec des privileges
sudo - Une connaissance de base de la ligne de commande et d’un editeur de texte (
nanoouvim)
Verifiez que cron est installe et en cours d’execution :
# Check if cron is active
systemctl status cron
# On RHEL/CentOS, the service is called crond
systemctl status crond
Si cron n’est pas installe, installez-le :
# Debian/Ubuntu
sudo apt update && sudo apt install -y cron
# RHEL/CentOS/Fedora
sudo dnf install -y cronie
# Enable and start the service
sudo systemctl enable cron && sudo systemctl start cron
Qu’est-ce que Cron ?
Cron est un demon de planification de taches base sur le temps present sur pratiquement tous les systemes Unix et Linux. Le nom provient du mot grec chronos (temps). Cron lit des fichiers de configuration appeles crontabs (tables cron) et execute des commandes a des intervalles specifies — une fois par minute, une fois par heure, une fois par jour, ou toute combinaison de champs de temps que vous definissez.
Cron resout un probleme simple mais crucial : les taches qui doivent se produire regulierement ne devraient pas dependre de quelqu’un qui se souvienne de les executer. Les sauvegardes automatisees, le nettoyage des logs, la surveillance du systeme, le renouvellement des certificats et la maintenance des bases de donnees sont autant de taches qui relevent de cron.
Comment Fonctionne Cron
Comprendre l’architecture vous aide a deboguer les problemes plus rapidement.
Le Demon Cron
Le demon cron (crond ou cron) demarre au lancement du systeme et s’execute en continu en arriere-plan. Chaque minute, il se reveille et verifie tous les fichiers crontab a la recherche de taches planifiees pour l’instant present. S’il trouve une correspondance, il execute la commande.
# Verify the daemon is running
ps aux | grep cron
Crontabs Utilisateur
Chaque utilisateur du systeme peut avoir son propre crontab. Ceux-ci sont stockes dans /var/spool/cron/crontabs/ (Debian/Ubuntu) ou /var/spool/cron/ (RHEL/CentOS). Vous ne devriez jamais modifier ces fichiers directement — utilisez toujours la commande crontab.
Le Crontab Systeme
Le fichier /etc/crontab est le crontab au niveau du systeme. Contrairement aux crontabs utilisateur, il inclut un champ de nom d’utilisateur entre les champs de temps et la commande :
# /etc/crontab format (note the username field)
# 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
Le Repertoire /etc/cron.d/
Les mainteneurs de paquets et les administrateurs systeme peuvent deposer des fichiers cron individuels dans /etc/cron.d/. Ceux-ci suivent le meme format que /etc/crontab (avec le champ de nom d’utilisateur). C’est la methode preferee pour ajouter des cron jobs au niveau systeme car les fichiers sont isoles et faciles a gerer.
Syntaxe Crontab Expliquee
Chaque entree crontab est une seule ligne composee de cinq champs de date et d’heure suivis de la commande a executer :
┌───────────── minute (0–59)
│ ┌───────────── heure (0–23)
│ │ ┌───────────── jour du mois (1–31)
│ │ │ ┌───────────── mois (1–12 ou jan–dec)
│ │ │ │ ┌───────────── jour de la semaine (0–7, 0 et 7 = dimanche, ou sun–sat)
│ │ │ │ │
* * * * * commande_a_executer
Valeurs des Champs et Operateurs
| Operateur | Signification | Exemple |
|---|---|---|
* | N’importe quelle valeur | * * * * * = chaque minute |
, | Liste de valeurs | 1,15,30 * * * * = minutes 1, 15, 30 |
- | Plage de valeurs | 1-5 * * * * = minutes 1 a 5 |
/ | Valeurs par pas | */10 * * * * = toutes les 10 minutes |
Exemples de Specifications Temporelles
# Every minute
* * * * * /chemin/vers/script.sh
# Every day at 2:30 AM
30 2 * * * /chemin/vers/script.sh
# Every Monday at 5:00 PM
0 17 * * 1 /chemin/vers/script.sh
# Every 15 minutes
*/15 * * * * /chemin/vers/script.sh
# First day of every month at midnight
0 0 1 * * /chemin/vers/script.sh
# Every weekday (Mon-Fri) at 8:00 AM
0 8 * * 1-5 /chemin/vers/script.sh
# Every 6 hours
0 */6 * * * /chemin/vers/script.sh
# January 1st at midnight
0 0 1 1 * /chemin/vers/script.sh
Chaines Speciales
Cron prend egalement en charge des chaines abregees pour les planifications courantes :
| Chaine | Equivalent | Description |
|---|---|---|
@reboot | N/A | Executer une fois au demarrage |
@yearly | 0 0 1 1 * | Une fois par an (1er janvier, minuit) |
@monthly | 0 0 1 * * | Une fois par mois (1er, minuit) |
@weekly | 0 0 * * 0 | Une fois par semaine (dimanche, minuit) |
@daily | 0 0 * * * | Une fois par jour (minuit) |
@hourly | 0 * * * * | Une fois par heure (minute 0) |
# Run a script at every system reboot
@reboot /home/utilisateur/taches-demarrage.sh
# Daily log rotation
@daily /usr/local/bin/rotation-logs.sh
Gestion de Crontab
La commande crontab est votre interface principale pour creer et gerer les taches planifiees.
Modifier Votre Crontab
# Open your crontab in the default editor
crontab -e
# Edit another user's crontab (requires root)
sudo crontab -u www-data -e
La premiere fois que vous executez crontab -e, il vous sera demande de choisir un editeur. Selectionnez nano si vous n’etes pas familier avec vim.
Lister les Taches en Cours
# List your cron jobs
crontab -l
# List another user's cron jobs
sudo crontab -u www-data -l
# List the system crontab
cat /etc/crontab
Supprimer un Crontab
# Remove your entire crontab (use with caution)
crontab -r
# Interactive removal -- asks for confirmation
crontab -i -r
# Remove another user's crontab
sudo crontab -u username -r
Attention :
crontab -rsupprime immediatement tous vos cron jobs sans confirmation et sans possibilite d’annulation. Si vous souhaitez supprimer une seule entree, utilisezcrontab -eet effacez la ligne specifique.
Sauvegarder Votre Crontab
Sauvegardez toujours votre crontab avant d’effectuer des modifications :
# Save current crontab to a file
crontab -l > ~/crontab-backup-$(date +%Y%m%d).txt
# Restore from backup
crontab ~/crontab-backup-20260124.txt
Variables d’Environnement dans Cron
L’une des causes les plus courantes d’echec des cron jobs est l’environnement. Les cron jobs s’executent avec un environnement minimal tres different de votre shell interactif. Vos fichiers ~/.bashrc, ~/.bash_profile et scripts de connexion ne sont pas charges.
L’Environnement par Defaut de Cron
Par defaut, cron ne definit generalement que :
SHELL=/bin/sh
PATH=/usr/bin:/bin
HOME=/home/username
LOGNAME=username
Remarquez que /usr/local/bin, /snap/bin et d’autres repertoires que vous pourriez attendre dans votre PATH sont absents. C’est pourquoi une commande qui fonctionne parfaitement dans votre terminal peut echouer silencieusement dans cron.
Definir des Variables dans Crontab
Vous pouvez definir des variables d’environnement en haut de votre crontab :
# Set a complete PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Set the shell
SHELL=/bin/bash
# Set email for cron output
MAILTO=admin@example.com
# Your cron jobs below
0 2 * * * /home/utilisateur/backup.sh
Utiliser des Chemins Absolus dans les Commandes
L’approche la plus sure est de toujours utiliser des chemins absolus pour chaque commande dans vos cron jobs :
# Bad -- relies on PATH
0 2 * * * mysqldump mydb > /tmp/backup.sql
# Good -- uses full path
0 2 * * * /usr/bin/mysqldump mydb > /tmp/backup.sql
Vous pouvez trouver le chemin complet de n’importe quelle commande avec which :
which mysqldump
# Output: /usr/bin/mysqldump
which python3
# Output: /usr/bin/python3
Sortie et Journalisation
Par defaut, cron envoie par courriel toute sortie (stdout et stderr) d’une tache vers la boite aux lettres locale du proprietaire du crontab. Sur la plupart des serveurs, personne ne la lit. Une journalisation appropriee est essentielle.
Rediriger la Sortie vers un Fichier de Log
# Redirect stdout and stderr to a log file
0 2 * * * /home/utilisateur/backup.sh >> /var/log/backup.log 2>&1
# Separate stdout and stderr into different files
0 2 * * * /home/utilisateur/backup.sh >> /var/log/backup.log 2>> /var/log/backup-errors.log
# Discard all output (silent execution)
0 2 * * * /home/utilisateur/backup.sh > /dev/null 2>&1
Bonne Pratique : Ne supprimez jamais la sortie pendant le developpement et les tests. Une fois que votre cron job est eprouve et stable, vous pouvez rediriger uniquement stderr et supprimer stdout :
command > /dev/null 2>> /var/log/errors.log.
Utiliser MAILTO pour les Notifications par Courriel
La variable MAILTO controle ou cron envoie la sortie des taches :
# Send output to a specific email address
MAILTO=admin@example.com
# Send to multiple recipients
MAILTO=admin@example.com,devops@example.com
# Disable email entirely
MAILTO=""
# All jobs below inherit the MAILTO setting
0 2 * * * /home/utilisateur/backup.sh
Pour que le courriel fonctionne, votre serveur a besoin d’un agent de transfert de courriel (MTA) fonctionnel comme postfix ou sendmail.
Consulter le Log de Cron
Cron journalise chaque execution de tache dans syslog. C’est votre premier recours lors du debogage :
# View cron entries in syslog (Debian/Ubuntu)
grep CRON /var/log/syslog
# View cron entries on RHEL/CentOS
grep CRON /var/log/cron
# Follow the log in real time
tail -f /var/log/syslog | grep CRON
Une entree de log typique ressemble a ceci :
Jan 24 02:00:01 server CRON[12345]: (user) CMD (/home/user/backup.sh)
Cela confirme que la tache a ete declenchee. Si la commande n’apparait pas dans le log, le probleme se situe au niveau de la syntaxe du crontab ou du demon lui-meme.
Exemples Pratiques
Exemple 1 : Sauvegarde Automatisee de Base de Donnees
# Back up a MySQL database every night at 2:00 AM
0 2 * * * /usr/bin/mysqldump -u dbuser -p'SecurePass123' mydb | /usr/bin/gzip > /backup/mysql/mydb-$(date +\%Y\%m\%d).sql.gz 2>> /var/log/mysql-backup.log
Remarque : Dans crontab, vous devez echapper les signes pourcentage (
%) avec une barre oblique inversee (\%) car cron interprete%comme un saut de ligne. C’est l’un des pieges les plus courants de cron.
Une approche plus robuste utilise un script enveloppant :
#!/bin/bash
# /home/utilisateur/scripts/mysql-backup.sh
BACKUP_DIR="/backup/mysql"
DB_NAME="mydb"
DATE=$(date +%Y%m%d_%H%M%S)
LOG="/var/log/mysql-backup.log"
echo "[$DATE] Starting backup of $DB_NAME" >> "$LOG"
/usr/bin/mysqldump -u dbuser -p'SecurePass123' "$DB_NAME" | /usr/bin/gzip > "$BACKUP_DIR/${DB_NAME}-${DATE}.sql.gz"
if [ $? -eq 0 ]; then
echo "[$DATE] Backup completed successfully" >> "$LOG"
else
echo "[$DATE] ERROR: Backup failed" >> "$LOG"
fi
# Delete backups older than 30 days
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +30 -delete
# Crontab entry for the wrapper script
0 2 * * * /home/utilisateur/scripts/mysql-backup.sh
Exemple 2 : Nettoyage des Logs
# Delete log files older than 7 days every Sunday at 3:00 AM
0 3 * * 0 /usr/bin/find /var/log/myapp -name "*.log" -mtime +7 -delete >> /var/log/cleanup.log 2>&1
# Compress logs older than 1 day, every day at 4:00 AM
0 4 * * * /usr/bin/find /var/log/myapp -name "*.log" -mtime +1 ! -name "*.gz" -exec /usr/bin/gzip {} \; 2>> /var/log/cleanup-errors.log
Exemple 3 : Surveillance du Systeme
# Check disk usage every 5 minutes, alert if above 90%
*/5 * * * * /home/utilisateur/scripts/disk-check.sh
Le script de surveillance :
#!/bin/bash
# /home/utilisateur/scripts/disk-check.sh
THRESHOLD=90
df -H | awk 'NR>1 {print $5 " " $6}' | while read usage mount; do
percent=$(echo "$usage" | tr -d '%')
if [ "$percent" -ge "$THRESHOLD" ]; then
echo "ATTENTION : Utilisation disque sur $mount a ${usage}" | \
/usr/bin/mail -s "Alerte Disque : $mount a ${usage}" admin@example.com
fi
done
Exemple 4 : Renouvellement de Certificats SSL
# Attempt certificate renewal twice daily (Let's Encrypt recommendation)
0 4,16 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/certbot-renew.log 2>&1
Exemple 5 : Verification des Mises a Jour Systeme
# Check for available updates every morning at 6:00 AM
0 6 * * * /usr/bin/apt update -qq && /usr/bin/apt list --upgradable 2>/dev/null | /usr/bin/mail -s "Rapport des Mises a Jour Disponibles" admin@example.com
Repertoires Cron
Les distributions Linux fournissent un ensemble de repertoires pour les scripts qui doivent s’executer a des intervalles predefinis. Il suffit de deposer un script executable dans le repertoire approprie :
| Repertoire | Frequence |
|---|---|
/etc/cron.hourly/ | Toutes les heures |
/etc/cron.daily/ | Tous les jours |
/etc/cron.weekly/ | Toutes les semaines |
/etc/cron.monthly/ | Tous les mois |
# List all scripts in cron.daily
ls -la /etc/cron.daily/
Exigences pour les Scripts dans les Repertoires Cron
- Le script doit etre executable :
chmod +x /etc/cron.daily/monscript - Le script ne doit pas avoir d’extension de fichier (
.sh,.py, etc.) —run-partsignore les fichiers avec des points dans le nom par defaut sur de nombreux systemes - Le script doit commencer par un shebang correct :
#!/bin/bash
# Create a daily cleanup script
sudo nano /etc/cron.daily/cleanup-temp
# Add content:
#!/bin/bash
find /tmp -type f -mtime +7 -delete
# Make it executable
sudo chmod +x /etc/cron.daily/cleanup-temp
Remarque : Ces repertoires sont geres par
anacronsur de nombreuses distributions, ce qui garantit que les taches manquees s’executent apres le retour en ligne du systeme. C’est particulierement utile pour les portables et les postes de travail qui ne fonctionnent pas 24h/24.
Considerations de Securite
Controler l’Acces avec cron.allow et cron.deny
Vous pouvez restreindre les utilisateurs autorises a creer des cron jobs :
# /etc/cron.allow -- only listed users can use cron
echo "admin" | sudo tee /etc/cron.allow
echo "deploy" | sudo tee -a /etc/cron.allow
# /etc/cron.deny -- listed users are blocked from using cron
echo "guest" | sudo tee /etc/cron.deny
La logique est la suivante :
- Si
/etc/cron.allowexiste, seuls les utilisateurs qui y figurent peuvent utiliser cron - Si
/etc/cron.allown’existe pas mais que/etc/cron.denyexiste, tout le monde sauf les utilisateurs listes peut utiliser cron - Si aucun des deux fichiers n’existe, le comportement par defaut depend de la distribution (souvent seul root)
Permissions des Fichiers
Les cron jobs s’executent avec les permissions de l’utilisateur proprietaire du crontab. Gardez vos scripts securises :
# Ensure scripts are owned by the correct user and not world-writable
chmod 750 /home/utilisateur/scripts/backup.sh
chown utilisateur:utilisateur /home/utilisateur/scripts/backup.sh
# Never store passwords in crontab -- use config files with restricted permissions
chmod 600 /home/utilisateur/.my.cnf
Eviter d’Executer des Cron Jobs en tant que Root
Dans la mesure du possible, creez un utilisateur de service dedie pour les taches cron :
# Create a dedicated backup user
sudo useradd -r -s /usr/sbin/nologin backupuser
# Set up its crontab
sudo crontab -u backupuser -e
Reference Rapide de la Syntaxe Crontab
| Planification | Expression | Description |
|---|---|---|
| Chaque minute | * * * * * | S’execute chaque minute de chaque jour |
| Toutes les 5 minutes | */5 * * * * | S’execute aux minutes 0, 5, 10, 15, … |
| Toutes les heures | 0 * * * * | S’execute au debut de chaque heure |
| Toutes les 6 heures | 0 */6 * * * | S’execute a 0h00, 6h00, 12h00, 18h00 |
| Quotidien a minuit | 0 0 * * * | S’execute une fois par jour a 00h00 |
| Quotidien a 2h30 | 30 2 * * * | S’execute une fois par jour a 02h30 |
| Chaque lundi a 9h | 0 9 * * 1 | S’execute chaque semaine le lundi matin |
| Jours ouvrables a 8h | 0 8 * * 1-5 | Du lundi au vendredi a 08h00 |
| Premier du mois | 0 0 1 * * | Minuit le 1er de chaque mois |
| Chaque trimestre | 0 0 1 1,4,7,10 * | Minuit le 1er jan, avr, jul, oct |
| Deux fois par jour | 0 4,16 * * * | S’execute a 4h00 et 16h00 |
| Toutes les 30 minutes | */30 * * * * | S’execute a :00 et :30 de chaque heure |
| Au redemarrage | @reboot | S’execute une fois au demarrage du systeme |
Depannage
Probleme : Le Cron Job Fonctionne dans le Terminal mais Pas dans Cron
Cause : Differences de PATH. Votre shell interactif dispose d’un PATH riche ; cron non.
Solution : Utilisez des chemins absolus pour toutes les commandes, ou definissez PATH en haut de votre crontab :
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Probleme : Les Signes Pourcentage Cassent les Commandes
Cause : Cron interprete % comme un caractere de saut de ligne.
Solution : Echappez tous les signes pourcentage avec une barre oblique inversee :
# Wrong
0 2 * * * /usr/bin/date +%Y%m%d
# Correct
0 2 * * * /usr/bin/date +\%Y\%m\%d
Probleme : Erreurs de Permission Refusee
Cause : Le script n’est pas executable ou l’utilisateur n’a pas les droits d’acces.
Solution :
# Make the script executable
chmod +x /home/utilisateur/scripts/monscript.sh
# Verify ownership
ls -la /home/utilisateur/scripts/monscript.sh
Probleme : Problemes de Fuseau Horaire
Cause : Cron utilise le fuseau horaire du systeme par defaut. Si votre serveur est configure en UTC mais que vous attendez l’heure locale, les taches s’executent a des heures inattendues.
Solution :
# Check system timezone
timedatectl
# Set timezone
sudo timedatectl set-timezone Europe/Paris
# Or set TZ in crontab for per-job timezone
TZ=Europe/Paris
0 9 * * * /home/utilisateur/rapport-matinal.sh
Probleme : La Tache S’execute mais Ne Produit Aucune Sortie
Cause : La sortie est envoyee au courriel local, que personne ne lit, ou la sortie est supprimee.
Solution : Redirigez la sortie vers un fichier de log :
0 2 * * * /home/utilisateur/backup.sh >> /var/log/backup.log 2>&1
Probleme : Le Demon Cron Ne Tourne Pas
Solution :
# Check status
sudo systemctl status cron
# Start it
sudo systemctl start cron
# Enable at boot
sudo systemctl enable cron
Resume
Cron est la colonne vertebrale de l’automatisation sous Linux. Avec cinq simples champs de temps et une commande, vous pouvez planifier virtuellement n’importe quelle tache pour qu’elle s’execute a n’importe quel intervalle. Les points cles a retenir sont :
- Utilisez toujours des chemins absolus pour les commandes dans les cron jobs
- Echappez les signes pourcentage (
\%) dans les entrees crontab - Redirigez la sortie vers des fichiers de log pour le debogage et l’audit
- Definissez les variables d’environnement (en particulier PATH) en haut de votre crontab
- Sauvegardez votre crontab avant d’effectuer des modifications
- Consultez syslog (
grep CRON /var/log/syslog) lorsqu’une tache ne s’execute pas comme prevu - Restreignez l’acces avec
/etc/cron.allowet/etc/cron.deny
Cron fonctionne en synergie avec d’autres pratiques d’administration de serveurs. Pour securiser le serveur qui execute vos cron jobs, consultez la Liste de Verification de Securite pour Serveurs Linux et Durcissement SSH : 12 Etapes pour Securiser Votre Serveur Linux.