Retour au cours

planification de tâches : cron et timers systemd

Objectifs

  • Planifier l’exécution récurrente de scripts avec cron.
  • Comprendre le format d’une ligne crontab.
  • Découvrir l’approche moderne de la planification avec les timers systemd.
  • Savoir quand utiliser l’une ou l’autre de ces méthodes.

cron : Le planificateur de tâches traditionnel

cron est l’outil historique et universel sur les systèmes Unix pour exécuter des tâches à des moments précis. C’est un service qui tourne en permanence et qui lit des fichiers de configuration appelés crontab.

  • Pour éditer votre crontab personnelle : crontab -e
  • Pour lister son contenu : crontab -l

Format d’une ligne crontab

Chaque ligne représente une tâche planifiée et suit un format strict de 6 champs.

# ┌───────────── 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
  • * : Le joker, qui signifie “chaque”.
  • */15 : Signifie “toutes les 15” (ex: toutes les 15 minutes).
  • 0 3 * * 1 : Signifie “à 3h00 du matin, tous les lundis”.

Exemple de crontab

# Désactiver l'envoi d'emails par défaut
MAILTO=""

# Toutes les nuits à 2h00, lancer le script de backup.
# Rediriger la sortie standard et les erreurs vers un fichier de log.
0 2 * * * /home/alice/scripts/backup.sh > /home/alice/logs/backup.log 2>&1

Points d’attention avec cron :

  • L’environnement d’exécution est minimal. Il faut toujours utiliser des chemins absolus.
  • Par défaut, toute sortie est envoyée par email. Il faut donc toujours rediriger la sortie vers un fichier de log ou /dev/null.

Timers systemd : L’approche moderne

Sur les distributions Linux modernes, systemd offre une alternative plus puissante et plus transparente : les “timers”. Le principe est de séparer la tâche de sa planification :

  1. Un fichier .service décrit ce qu’il faut faire (la commande à exécuter).
  2. Un fichier .timer décrit quand il faut le faire.

Avantages sur cron

  • Journalisation intégrée : Plus besoin de gérer les redirections. Toute la sortie est automatiquement capturée et consultable avec journalctl -u nom_du_service.
  • Gestion des dépendances : Vous pouvez spécifier qu’une tâche ne doit se lancer qu’après le démarrage du réseau, par exemple.
  • Contrôle fin : Vous pouvez spécifier l’utilisateur, le répertoire de travail, les limites de ressources, etc., directement dans le fichier de service.

Exemple

Fichier backup.service :

[Unit]
Description=Lancer mon script de backup

[Service]
ExecStart=/home/alice/scripts/backup.sh

Fichier backup.timer :

[Unit]
Description=Lance le backup tous les jours à 2h

[Timer]
OnCalendar=daily 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

cron vs. Timers systemd : Lequel choisir ?

  • cron :

    • Avantages : Simple, universel (présent sur tous les systèmes de type Unix, y compris macOS et BSD).
    • Idéal pour : Des tâches utilisateur simples et rapides, ou lorsque la portabilité est une priorité absolue.
  • Timers systemd :

    • Avantages : Robuste, puissant, excellente journalisation, meilleur contrôle.
    • Idéal pour : Les tâches d’administration système sur des serveurs Linux modernes.

En résumé : pour une tâche système sur un serveur de production moderne, préférez un timer systemd. Pour une petite tâche personnelle sur votre machine, cron reste parfaitement valable.

Exercices

  1. Votre premier cronjob :

    • Ouvrez votre crontab avec crontab -e.
    • Ajoutez la ligne suivante pour écrire la date dans un fichier toutes les minutes : * * * * * /bin/date >> /tmp/ma_cron.log 2>&1
    • Attendez une ou deux minutes et vérifiez le contenu de /tmp/ma_cron.log.
    • N’oubliez pas de supprimer la ligne de votre crontab après l’exercice (crontab -e).
  2. Simulation d’un script de nuit :

    • Écrivez une ligne de crontab qui exécuterait un script /opt/scripts/rapport_mensuel.sh le premier jour de chaque mois à 5h du matin.
  3. (Théorique) Conversion en timer :

    • Comment traduiriez-vous la tâche de l’exercice 2 en un timer systemd ?
    • Quelle serait la valeur de la directive OnCalendar= dans le fichier .timer ? (Indice : monthly ou *-*-01 05:00:00).