Prérequis
- Un serveur Linux (Ubuntu, Debian, AlmaLinux 9, Rocky Linux 9)
- Accès root ou sudo
Cron permet de planifier des tâches récurrentes sur Linux : sauvegardes, maintenance, scripts personnalisés. Ce guide explique la syntaxe et les bonnes pratiques.
1. Installer Cron
# Installer cron (généralement déjà présent)
apt update
apt install -y cron
# S'assurer que le service est actif
systemctl enable --now cron# Installer cronie (généralement déjà présent)
dnf install -y cronie
# S'assurer que le service est actif
systemctl enable --now crond2. Syntaxe Cron
# ┌───────────── minute (0 - 59)
# │ ┌───────────── heure (0 - 23)
# │ │ ┌───────────── jour du mois (1 - 31)
# │ │ │ ┌───────────── mois (1 - 12)
# │ │ │ │ ┌───────────── jour de la semaine (0 - 6) (0 = dimanche)
# │ │ │ │ │
# * * * * * commande à exécuter3. Exemples courants
# Toutes les minutes
* * * * * /chemin/script.sh
# Toutes les 5 minutes
*/5 * * * * /chemin/script.sh
# Toutes les heures à :00
0 * * * * /chemin/script.sh
# Tous les jours à 3h00
0 3 * * * /chemin/script.sh
# Tous les lundis à 9h00
0 9 * * 1 /chemin/script.sh
# Le 1er de chaque mois à minuit
0 0 1 * * /chemin/script.sh
# Du lundi au vendredi à 8h00
0 8 * * 1-5 /chemin/script.sh
# Toutes les 30 minutes de 9h à 17h
*/30 9-17 * * * /chemin/script.sh
# Deux fois par jour (8h et 20h)
0 8,20 * * * /chemin/script.sh4. Éditer le crontab
# Éditer le crontab de l'utilisateur courant
crontab -e
# Lister les tâches cron
crontab -l
# Supprimer toutes les tâches
crontab -r
# Éditer le crontab d'un autre utilisateur (root)
crontab -u nom_utilisateur -e
# Lister les tâches d'un autre utilisateur
crontab -u nom_utilisateur -l5. Raccourcis spéciaux
@reboot # Au démarrage du serveur
@yearly # Une fois par an (0 0 1 1 *)
@annually # Identique à @yearly
@monthly # Une fois par mois (0 0 1 * *)
@weekly # Une fois par semaine (0 0 * * 0)
@daily # Une fois par jour (0 0 * * *)
@midnight # Identique à @daily
@hourly # Toutes les heures (0 * * * *)
# Exemples
@reboot /chemin/script_demarrage.sh
@daily /chemin/backup.sh
@hourly /chemin/check_status.sh6. Variables d'environnement
# Définir des variables en haut du crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@votredomaine.com
# Les tâches cron n'ont pas le même PATH qu'un shell interactif !
# Utilisez toujours des chemins absolus
0 3 * * * /usr/bin/python3 /home/user/script.py7. Redirection des sorties
# Ignorer toutes les sorties
0 3 * * * /chemin/script.sh > /dev/null 2>&1
# Logger dans un fichier
0 3 * * * /chemin/script.sh >> /var/log/mon_script.log 2>&1
# Logger avec la date
0 3 * * * /chemin/script.sh >> /var/log/mon_script.log 2>&1 && echo "$(date): Script exécuté" >> /var/log/mon_script.log
# Séparer stdout et stderr
0 3 * * * /chemin/script.sh >> /var/log/output.log 2>> /var/log/error.logConseil
Redirigez toujours les sorties ! Par défaut, cron envoie un email pour chaque sortie, ce qui peut saturer votre boîte mail.
8. Dossiers cron.d
# Les scripts dans ces dossiers s'exécutent automatiquement
ls /etc/cron.hourly/ # Toutes les heures
ls /etc/cron.daily/ # Tous les jours
ls /etc/cron.weekly/ # Toutes les semaines
ls /etc/cron.monthly/ # Tous les mois
# Créer un script cron quotidien
cat > /etc/cron.daily/mon_script << 'EOF'
#!/bin/bash
# Mon script quotidien
echo "Exécuté le $(date)"
EOF
chmod +x /etc/cron.daily/mon_script
# Fichiers personnalisés dans /etc/cron.d/
cat > /etc/cron.d/mon_job << 'EOF'
# Format : minute heure jour mois jour_semaine UTILISATEUR commande
0 3 * * * root /chemin/script.sh
EOF9. Exemples pratiques
# Backup MySQL tous les jours à 3h
0 3 * * * mysqldump -u root -p'motdepasse' --all-databases | gzip > /backup/mysql-$(date +\%Y-\%m-\%d).sql.gz
# Nettoyer les fichiers temp de plus de 7 jours
0 4 * * * find /tmp -type f -mtime +7 -delete
# Renouveler les certificats Let's Encrypt
0 3 * * * certbot renew --quiet
# Synchroniser des fichiers
*/30 * * * * rsync -avz /source/ /destination/
# Vérifier l'espace disque
0 */6 * * * df -h | mail -s "Rapport espace disque" admin@domaine.com
# Redémarrer un service chaque nuit
0 4 * * * systemctl restart apache210. Dépannage
# Voir les logs cron
tail -f /var/log/syslog | grep CRON
# Ou
journalctl -u cron -f
# Vérifier si cron tourne
systemctl status cron
# Tester un script manuellement
/bin/bash -x /chemin/script.sh
# Simuler l'environnement cron
env -i /bin/bash --noprofile --norc -c '/chemin/script.sh'# Voir les logs cron
tail -f /var/log/cron
# Ou
journalctl -u crond -f
# Vérifier si crond tourne
systemctl status crond
# Tester un script manuellement
/bin/bash -x /chemin/script.sh
# Simuler l'environnement cron
env -i /bin/bash --noprofile --norc -c '/chemin/script.sh'11. Bonnes pratiques
- Utilisez toujours des chemins absolus
- Redirigez les sorties vers des fichiers log
- Testez vos scripts manuellement avant de les planifier
- Ajoutez des commentaires pour expliquer chaque tâche
- Évitez d'exécuter trop de tâches à minuit (surcharge)
- Utilisez flock pour éviter les exécutions parallèles
- Surveillez les logs pour détecter les erreurs
# Empêcher qu'un script s'exécute en double
*/5 * * * * flock -n /tmp/mon_script.lock /chemin/script.shCron configuré !
Vous pouvez maintenant automatiser vos tâches récurrentes. N'oubliez pas de surveiller les logs pour vous assurer que tout fonctionne correctement.