Retour au cours

cron

Objectifs

  • Comprendre le rôle du service cron pour exécuter des tâches planifiées.
  • Lire et écrire une ligne de crontab pour planifier une commande à un moment précis.
  • Planifier des tâches à intervalle régulier (ex: toutes les 5 minutes, tous les jours).
  • Gérer correctement la sortie et les erreurs d’un script lancé par cron.

Explications détaillées

Notions clés

cron : Le planificateur de tâches

cron est un service système (un “démon”) qui tourne en permanence sur les systèmes de type Unix. Son unique but est de lancer des commandes ou des scripts à des dates et heures prédéfinies. C’est l’outil de base pour toute automatisation récurrente : backups nocturnes, rapports hebdomadaires, nettoyage de fichiers temporaires, etc.

crontab : Le fichier de configuration

Chaque utilisateur du système peut avoir son propre fichier de configuration pour cron. Ce fichier est appelé une crontab (cron table).

  • crontab -e : La commande pour éditer votre crontab personnelle.
  • crontab -l : La commande pour lister le contenu de votre crontab actuelle.
  • crontab -r : La commande pour retirer (supprimer) votre crontab.

Le format d’une ligne crontab

Chaque ligne dans une crontab représente une tâche planifiée et est composée de 6 champs, séparés par des espaces.

# ┌───────────── minute (0 - 59)
# │ ┌───────────── heure (0 - 23)
# │ │ ┌───────────── jour du mois (1 - 31)
# │ │ │ ┌───────────── mois (1 - 12)
# │ │ │ │ ┌───────────── jour de la semaine (0 - 6) (0 ou 7 = Dimanche)
# │ │ │ │ │
# │ │ │ │ │
# * * * * *  /chemin/absolu/vers/la/commande_a_executer
  • * : Le joker, qui signifie “chaque”. Une ligne * * * * * ... s’exécutera donc chaque minute.
  • */N : “Toutes les N”. Par exemple, */15 dans le champ des minutes signifie “toutes les 15 minutes”.
  • 5 4 * * * : À 4h05, tous les jours.
  • 0 2 * * 1 : À 2h00 du matin, tous les lundis.

Gestion de la sortie et des erreurs

Par défaut, cron envoie un email à l’utilisateur avec toute sortie (stdout ou stderr) générée par la commande. Pour éviter d’inonder votre boîte mail, il est essentiel de rediriger ces sorties.

  • > /chemin/log.txt 2>&1 : Redirige stdout et stderr vers un fichier de log.
  • > /dev/null 2>&1 : Ignore complètement toute sortie.

Vous pouvez aussi définir la variable MAILTO="" en haut de votre crontab pour désactiver globalement l’envoi d’emails.

Syntaxe / Usages

# Exemples de lignes crontab :

# Exécuter un script de backup tous les jours à 3h30 du matin
30 3 * * * /home/user/scripts/backup.sh > /home/user/logs/backup.log 2>&1

# Vérifier l'espace disque toutes les 10 minutes
*/10 * * * * /home/user/scripts/check_disk.sh

# Exécuter une tâche de nettoyage tous les dimanches à minuit
0 0 * * 0 /home/user/scripts/cleanup.sh > /dev/null 2>&1

Bonnes pratiques

  • Utilisez des chemins absolus pour vos scripts et commandes. L’environnement d’exécution de cron est très minimal et ne contient pas le PATH que vous avez dans votre session interactive.
  • Testez vos scripts en dehors de cron avant de les planifier. Assurez-vous qu’ils fonctionnent comme prévu.
  • Redirigez toujours la sortie. C’est la règle la plus importante. Soit vers un fichier de log pour garder une trace, soit vers /dev/null si la sortie n’est pas importante.
  • Commencez votre crontab par MAILTO="" si vous gérez les logs manuellement et ne voulez pas recevoir d’emails.

Pièges courants

  • L’environnement minimal : Votre script peut échouer dans cron alors qu’il fonctionne dans votre terminal, car des variables d’environnement (comme PATH) ou des alias ne sont pas définis. C’est pourquoi les chemins absolus sont si importants.
  • Permissions : Le script doit être exécutable (chmod +x) pour l’utilisateur qui possède la crontab.
  • Répertoire de travail : Par défaut, cron exécute les commandes depuis le répertoire personnel ($HOME) de l’utilisateur. Si votre script a besoin de se trouver dans un dossier spécifique, commencez-le par une commande cd /chemin/vers/mon/projet.
  • Le caractère % : cron traite le caractère % d’une manière spéciale. Si vous en avez besoin dans votre commande (par exemple avec date), vous devez l’échapper avec un backslash (\%).

Exercices

  1. Votre première tâche cron :

    • Ouvrez votre crontab avec crontab -e.
    • Ajoutez une ligne pour que la date et l’heure actuelles soient écrites dans un fichier /tmp/cron_test.txt toutes les minutes.
    • Attendez une minute ou deux, puis vérifiez le contenu du fichier avec cat /tmp/cron_test.txt.
  2. Amélioration avec logs :

    • Modifiez la tâche de l’exercice 1.
    • La sortie doit maintenant être ajoutée au fichier (>>) au lieu de l’écraser.
    • Assurez-vous que les erreurs éventuelles sont aussi redirigées vers ce même fichier.
  3. Nettoyage :

    • Une fois que vous avez bien compris le mécanisme, supprimez la tâche de test de votre crontab pour ne pas remplir votre /tmp inutilement. Utilisez crontab -e pour effacer la ligne.