Linux

Cron — Tâches planifiées

Automatiser l'exécution de scripts et commandes avec crontab : syntaxe, exemples pratiques et dépannage.

← Retour aux tutoriels Linux
📚 C'est quoi cron ? Cron est un planificateur de tâches intégré à Linux. Il permet d'exécuter automatiquement des commandes ou des scripts à des horaires précis : toutes les 5 minutes, chaque nuit à 2h, chaque lundi, etc. C'est l'outil idéal pour automatiser les sauvegardes, le nettoyage de fichiers, le monitoring ou le renouvellement de certificats SSL. Le fichier où on définit ces tâches s'appelle le crontab (cron table).
ⓘ Prérequis Un système Linux (Debian/Ubuntu). Le service cron est installé par défaut sur la plupart des distributions.

Comprendre la syntaxe cron

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

Gérer le crontab

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
⚠ Attention crontab -r supprime toutes vos tâches sans confirmation. Faites une sauvegarde avant : crontab -l > ~/crontab-backup.txt

Exemples pratiques

Voici des exemples concrets que vous pouvez copier-coller. Chaque ligne est expliquée :

Sauvegarde quotidienne à 2h du matin

# 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

Nettoyage des logs tous les dimanches

# 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

Monitoring toutes les 5 minutes

# */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

Renouvellement Let's Encrypt (2x par jour)

# 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"

Redémarrer un service chaque nuit

# 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

Exécuter uniquement en semaine (lundi-vendredi)

# 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

Raccourcis cron

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

Dépannage cron

Vérifier que cron tourne

# Vérifie que le service cron est bien actif
# Vous devez voir "Active: active (running)" en vert
sudo systemctl status cron

Consulter les logs 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"

Problèmes courants

⚠ Pièges fréquents
  • PATH : cron n'a pas le même PATH que votre shell. Utilisez des chemins absolus : /usr/bin/python3 au lieu de python3
  • Permissions : le script doit être exécutable (chmod +x)
  • Variables d'environnement : définissez-les en haut du crontab :
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    [email protected]
  • Redirection : sans 2>&1, les erreurs ne sont pas loggées

Exemple complet de crontab

# === 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
✔ Résultat Vous maîtrisez crontab : syntaxe, raccourcis, exemples pratiques et dépannage. Vos tâches de sauvegarde, monitoring et maintenance s'exécutent automatiquement.