Automatiser l'exécution de scripts et commandes avec crontab : syntaxe, exemples pratiques et dépannage.
cron est installé par défaut sur la plupart
des distributions.
Chaque ligne dans un crontab représente une tâche planifiée. Elle commence par 5 champs qui définissent le moment d'exécution, puis la commande à lancer. Voici le format :
# Voici comment lire une ligne crontab — chaque étoile (*) représente un champ :
#
# ┌───────────── minute (0 - 59) → À quelle minute de l'heure ?
# │ ┌───────────── heure (0 - 23) → À quelle heure du jour ?
# │ │ ┌───────────── jour du mois (1 - 31) → Quel jour du mois ?
# │ │ │ ┌───────────── mois (1 - 12) → Quel mois ?
# │ │ │ │ ┌───────────── jour de la semaine (0 - 7, 0 et 7 = dimanche)
# │ │ │ │ │
# * * * * * commande à exécuter
#
# Exemple concret : "30 2 * * *" = "à 2h30, tous les jours, tous les mois"
Voici les caractères spéciaux que vous pouvez utiliser dans chaque champ :
| Expression | Signification |
|---|---|
* |
Toutes les valeurs |
*/5 |
Toutes les 5 unités |
1,15 |
Les valeurs 1 et 15 |
1-5 |
De 1 à 5 |
Voici les commandes pour gérer votre crontab. Chaque utilisateur Linux a son propre crontab :
# Ouvre l'éditeur pour modifier vos tâches planifiées
# La première fois, il vous demandera quel éditeur utiliser (choisissez nano = le plus simple)
crontab -e
# Affiche la liste de toutes vos tâches planifiées actuelles
crontab -l
# DANGER : supprime TOUTES vos tâches sans demander confirmation !
# Ne l'utilisez que si vous êtes sûr de vouloir tout effacer
crontab -r
# Pour éditer le crontab d'un autre utilisateur (nécessite root/sudo)
# Utile pour les services web qui tournent sous l'utilisateur www-data
sudo crontab -u www-data -e
crontab -r supprime toutes vos tâches sans confirmation. Faites une
sauvegarde avant : crontab -l > ~/crontab-backup.txt
Voici des exemples concrets que vous pouvez copier-coller. Chaque ligne est expliquée :
# 0 = minute 0, 2 = 2h du matin, * * * = tous les jours, tous les mois
# >> redirige la sortie du script vers un fichier de log (on garde une trace)
# 2>&1 = les erreurs vont aussi dans le log (sinon on ne les verrait pas)
0 2 * * * /home/admin/scripts/backup.sh >> /var/log/backup.log 2>&1
# 0 3 = à 3h du matin, * * 0 = le dimanche (0 = dimanche)
# find cherche les fichiers .log de plus de 30 jours (-mtime +30) et les supprime
0 3 * * 0 find /var/log -name "*.log" -mtime +30 -delete
# */5 = toutes les 5 minutes (le slash signifie "tous les X")
# Le script de monitoring vérifie l'état des services et le disque
*/5 * * * * /home/admin/scripts/monitor.sh >> /var/log/monitor.log 2>&1
# 0 3,15 = à 3h ET à 15h (la virgule sépare plusieurs valeurs)
# certbot renew renouvelle les certificats SSL si nécessaire
# --quiet = pas de sortie sauf en cas d'erreur
# --post-hook = commande à exécuter APRÈS le renouvellement (recharger Nginx)
0 3,15 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
# 30 4 = à 4h30 du matin (heure calme, peu d'utilisateurs)
# Utile pour les services qui consomment de la mémoire au fil du temps
30 4 * * * systemctl restart docker
# 1-5 = du lundi (1) au vendredi (5)
# Le tiret définit une plage de valeurs
0 8 * * 1-5 /home/admin/scripts/rapport-quotidien.sh
Cron propose des raccourcis pratiques :
| Raccourci | Équivalent | Description |
|---|---|---|
@reboot |
— | À chaque démarrage |
@hourly |
0 * * * * |
Chaque heure |
@daily |
0 0 * * * |
Chaque jour à minuit |
@weekly |
0 0 * * 0 |
Chaque dimanche à minuit |
@monthly |
0 0 1 * * |
Le 1er de chaque mois |
# Lancer un script automatiquement au démarrage du serveur
# @reboot = s'exécute une seule fois, quand le système démarre
@reboot /home/admin/scripts/startup.sh
# Nettoyage quotidien à minuit
@daily /home/admin/scripts/cleanup.sh >> /var/log/cleanup.log 2>&1
# Vérifie que le service cron est bien actif
# Vous devez voir "Active: active (running)" en vert
sudo systemctl status cron
# Affiche les 20 dernières exécutions de cron dans les logs système
# Utile pour vérifier si votre tâche s'est bien lancée
grep CRON /var/log/syslog | tail -20
# Alternative avec journalctl (les logs de la dernière heure)
journalctl -u cron --since "1 hour ago"
/usr/bin/python3 au lieu de python3chmod +x)SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
2>&1, les erreurs ne sont pas loggées# === CRONTAB DE ADMIN ===
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Sauvegarde quotidienne à 2h
0 2 * * * /home/admin/scripts/backup.sh >> /var/log/backup.log 2>&1
# Monitoring toutes les 5 min
*/5 * * * * /home/admin/scripts/monitor.sh >> /var/log/monitor.log 2>&1
# Nettoyage des logs > 30 jours (dimanche 3h)
0 3 * * 0 find /var/log -name "*.log.*.gz" -mtime +30 -delete
# Rapport hebdo (lundi 8h)
0 8 * * 1 /home/admin/scripts/rapport-hebdo.sh
# Renouvellement certificats (2x/jour)
0 3,15 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
# Script au démarrage
@reboot /home/admin/scripts/startup.sh >> /var/log/startup.log 2>&1