Retour au cours

planification de tâches : cron, at et timers systemd

Objectifs

  • Planifier des tâches qui se répètent à intervalle régulier avec cron.
  • Exécuter une commande une seule fois dans le futur avec at.
  • Découvrir l’approche moderne et plus robuste des timers systemd.

En DevOps, de nombreuses actions doivent être exécutées automatiquement : backups, nettoyages, rapports… Maîtriser les outils de planification est donc essentiel.

cron : Le planificateur classique

cron est le service historique sur les systèmes Unix pour exécuter des tâches récurrentes. Chaque utilisateur peut avoir sa propre table de planification, la crontab.

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

Format d’une ligne crontab

# minute(0-59) heure(0-23) jour(1-31) mois(1-12) jour_semaine(0-6)
* * * * * /chemin/vers/la/commande

Exemples :

# Toutes les nuits à 2h30, lancer le script de backup.
# La sortie et les erreurs sont redirigées vers un fichier de log.
30 2 * * * /opt/scripts/backup.sh > /var/log/backup.log 2>&1

# Toutes les 15 minutes, lancer un script de monitoring.
*/15 * * * * /opt/scripts/monitoring.sh

Bonnes pratiques pour cron :

  • Utilisez toujours des chemins absolus pour vos scripts.
  • Redirigez toujours la sortie (> ... 2>&1) pour éviter de recevoir des emails et pour conserver des logs.

at : Exécuter une tâche plus tard

at est un outil plus simple pour exécuter une commande une seule fois, à une heure spécifiée.

# Exécuter la commande dans 5 minutes
echo "sudo reboot" | at now + 5 minutes

# Exécuter à 16h30 aujourd'hui
at 16:30 < /chemin/vers/mon_script.sh

# Lister les tâches en attente
atq

C’est pratique pour des actions ponctuelles, mais moins utilisé en automatisation lourde.

Timers systemd : L’approche moderne

Sur la plupart des systèmes Linux modernes, systemd offre une alternative plus puissante et plus facile à déboguer que cron. Une tâche est définie par deux fichiers : un fichier .service (la commande) et un fichier .timer (la planification).

Exemple backup.service :

[Unit]
Description=Lancer mon backup

[Service]
ExecStart=/opt/scripts/backup.sh

Exemple backup.timer :

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

[Timer]
OnCalendar=daily 02:30:00
Persistent=true # S'exécute au démarrage si l'heure a été manquée

[Install]
WantedBy=timers.target

Avantages :

  • Logs centralisés : journalctl -u backup.service vous montre toute l’historique et les sorties de votre tâche.
  • Meilleur contrôle : Vous pouvez spécifier des dépendances, des utilisateurs, des limites de ressources, etc.

Bonnes pratiques pour systemd :

  • Pour les services système sur des serveurs modernes, préférez les timers à cron.
  • N’oubliez pas de recharger systemd après chaque modification : sudo systemctl daemon-reload.
  • Activez le timer au démarrage : sudo systemctl enable mon_backup.timer.

Pièges courants

  • Environnement d’exécution minimal : Que ce soit avec cron ou systemd, les scripts s’exécutent avec un environnement minimal (pas votre $PATH ou vos alias habituels). C’est pourquoi les chemins absolus sont cruciaux.
  • Permissions : Le script doit être exécutable (chmod +x) par l’utilisateur qui l’exécute (root pour un service système, votre utilisateur pour une crontab personnelle).

Exercices

  1. Votre premier cronjob :

    • Ouvrez votre crontab (crontab -e).
    • Ajoutez une ligne qui écrit la date dans un fichier /tmp/date.log toutes les minutes.
    • Vérifiez que le fichier se met à jour, puis supprimez la ligne de votre crontab.
  2. Planifier avec at :

    • Si la commande at est installée, planifiez un touch /tmp/fichier_at.txt dans une minute.
    • Vérifiez que le fichier est bien créé.
  3. (Bonus) Créer un timer systemd :

    • En tant qu’utilisateur (pas besoin de sudo), créez les fichiers ~/.config/systemd/user/hello.service et ~/.config/systemd/user/hello.timer.
    • Le service doit simplement faire echo "Hello depuis un timer systemd".
    • Le timer doit se déclencher toutes les 5 minutes.
    • Activez-le avec systemctl --user start hello.timer et vérifiez les logs avec journalctl --user -u hello.service.