Retour au cours

systemd timers

Objectifs

  • Comprendre ce que sont les timers systemd et pourquoi ils sont une alternative moderne à cron.
  • Créer une unité .service pour définir la tâche à exécuter.
  • Créer une unité .timer pour définir la planification.
  • Activer et gérer les timers avec la commande systemctl.
  • Consulter les journaux d’exécution avec journalctl.

Explications détaillées

Notions clés

systemd : Plus qu’un simple planificateur

systemd est le gestionnaire de système et de services utilisé par la majorité des distributions Linux modernes (Debian, Ubuntu, CentOS, Fedora…). Il est responsable du démarrage du système, de la gestion des services, et bien plus encore. Les “timers” sont la manière dont systemd gère les tâches planifiées.

Avantages des timers systemd sur cron

  • Journalisation intégrée : Toute la sortie (standard et erreur) de votre tâche est automatiquement capturée par journalctl. Finis les emails ou les redirections manuelles.
  • Gestion fine de l’environnement : Vous pouvez spécifier l’utilisateur, le groupe, le répertoire de travail, et les variables d’environnement directement dans le fichier de service.
  • Dépendances : Un timer peut être configuré pour ne se lancer qu’après un autre service (ex: après que le réseau soit actif).
  • Sécurité accrue : systemd permet d’isoler les processus (“sandboxing”) en limitant leurs accès au système de fichiers ou au réseau.

Les deux fichiers : .service et .timer

Une tâche planifiée avec systemd est définie par une paire de fichiers, qui doivent porter le même nom (ex: mon_job.service et mon_job.timer).

  1. Le fichier .service : Il décrit quoi faire. C’est une définition de service classique.

    • [Unit]: Métadonnées comme la description.
    • [Service]: La commande à exécuter (ExecStart).
  2. Le fichier .timer : Il décrit quand le faire.

    • [Unit]: Doit contenir une référence au service à lancer (Unit=mon_job.service).
    • [Timer]: La planification. OnCalendar= est la directive la plus courante.
    • [Install]: Indique à systemd quand démarrer ce timer (généralement au démarrage du système).

Les fichiers d’unité pour les services système se placent dans /etc/systemd/system/.

Syntaxe / Usages

Exemple de fichier .service : /etc/systemd/system/backup.service

[Unit]
Description=Exécute le script de sauvegarde personnel

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mon_script_de_backup.sh
User=admin
  • Type=oneshot : Indique que c’est un processus qui s’exécute une fois et se termine.

Exemple de fichier .timer : /etc/systemd/system/backup.timer

[Unit]
Description=Lance le script de sauvegarde tous les jours à 2h
# Le timer déclenche le service du même nom
Requires=backup.service

[Timer]
# Syntaxe très flexible pour définir le calendrier
OnCalendar=daily 02:00
# On peut aussi utiliser : *-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
  • OnCalendar : Accepte des formats variés (hourly, daily, weekly, ou une expression détaillée).
  • Persistent=true : Si la machine était éteinte à 2h, la tâche s’exécutera dès le prochain démarrage.

Commandes systemctl

Après avoir créé ou modifié ces fichiers, il faut interagir avec systemd.

# Recharger la configuration de systemd (après chaque modification de fichier)
sudo systemctl daemon-reload

# Activer le timer pour qu'il démarre avec le système
sudo systemctl enable backup.timer

# Démarrer le timer immédiatement
sudo systemctl start backup.timer

# Lister tous les timers actifs et voir leur prochaine exécution
systemctl list-timers

# Voir les logs d'exécution du service
journalctl -u backup.service

Bonnes pratiques

  • Pour les tâches système sur des serveurs Linux modernes, préférez les timers systemd à cron. C’est plus robuste et plus facile à déboguer.
  • Utilisez les timers “utilisateur” (--user) pour les tâches qui ne nécessitent pas de privilèges root. Les fichiers se placent alors dans ~/.config/systemd/user/.
  • Utilisez journalctl pour inspecter la sortie de vos scripts. journalctl -u mon_job.service -f vous montrera les logs en temps réel.

Pièges courants

  • Oublier daemon-reload : Si vous modifiez un fichier .service ou .timer, systemd n’en sera pas informé tant que vous n’aurez pas exécuté sudo systemctl daemon-reload.
  • Erreurs de syntaxe dans OnCalendar : La syntaxe est puissante mais peut être déroutante. Utilisez systemd-analyze calendar pour la valider.
  • Problèmes de permissions : Assurez-vous que l’utilisateur spécifié dans le fichier .service (User=...) a bien le droit d’exécuter le script et d’accéder aux fichiers nécessaires.

Exercices

  1. Votre premier timer :

    • Créez un fichier /etc/systemd/system/hello.service qui exécute la commande /bin/echo "Hello depuis systemd".
    • Créez le fichier /etc/systemd/system/hello.timer associé qui se déclenche toutes les minutes (OnCalendar=*:0/1).
    • Rechargez, activez et démarrez le timer.
    • Utilisez systemctl list-timers pour voir quand il s’exécutera.
    • Utilisez journalctl -u hello.service pour voir sa sortie.
  2. Nettoyage :

    • Une fois que vous avez vu le message apparaître plusieurs fois, arrêtez et désactivez le timer.
    • sudo systemctl stop hello.timer
    • sudo systemctl disable hello.timer
    • Supprimez les deux fichiers que vous avez créés.
    • N’oubliez pas de faire sudo systemctl daemon-reload après la suppression.