Aller au contenu

Planification de tâches avec les timers systemd

Mise à jour :

Lorsque l’on cherche à automatiser des tâches sur un système Linux, le réflexe courant est de se tourner vers cron. Bien que fiable et largement utilisé, cron présente des limites, notamment lorsqu’il s’agit de suivre l’état des tâches ou d’interagir avec les services systemd. C’est ici que les Systemd Timers entrent en jeu, offrant une solution plus flexible et intégrée.

Les Systemd Timers permettent de planifier et d’automatiser des actions en tirant parti des fonctionnalités avancées de systemd, l’initiateur de services par défaut sur la plupart des distributions Linux modernes. Contrairement à cron, un Systemd Timer est intimement lié à un service systemd, ce qui permet de suivre facilement l’état de la tâche, d’obtenir des journaux détaillés et de gérer les erreurs avec plus de précision.

Fonctionnement des Systemd Timers

Les Systemd Timers fonctionnent en collaboration étroite avec les services systemd pour déclencher des tâches de manière programmée. À la différence des tâches cron, qui se contentent de lancer des commandes à des intervalles définis, un Systemd Timer est lié à un service systemd. En d’autres termes, le timer agit comme un déclencheur, tandis que le service est la tâche ou l’action qui sera exécutée lorsque le timer se déclenchera.

Chaque Systemd Timer se compose donc de deux fichiers principaux :

  • Un fichier .timer qui définit l’intervalle ou le calendrier de déclenchement.
  • Un fichier .service qui précise la commande ou le processus à exécuter.

Voici comment cela fonctionne concrètement : lorsque le timer arrive à l’instant programmé, il « active » le service associé, qui exécute alors la tâche spécifiée. Par exemple, si vous avez un timer configuré pour s’exécuter tous les jours à 3h du matin, il activera le service correspondant, qui pourra, par exemple, lancer un script de sauvegarde ou nettoyer des logs. Ce lien étroit entre le timer et le service assure une exécution structurée et bien organisée des tâches.

L’architecture des Systemd Timers permet également de bénéficier de tous les avantages de systemd, notamment :

  • Le suivi des états et des journaux : Vous pouvez facilement vérifier si le timer s’est exécuté correctement et consulter les logs pour chaque exécution via des commandes systemd comme journalctl.
  • Une gestion des erreurs plus poussée : Si une tâche échoue, le Systemd Timer peut tenter de la relancer ou de fournir des rapports d’erreur détaillés.
  • Un contrôle précis des conditions d’exécution : Les timers peuvent être configurés pour s’exécuter seulement si certaines conditions sont remplies, comme la présence d’un réseau ou l’état de veille du système.

Types de Systemd Timers

Il existe deux principaux types de Systemd Timers : les OnCalendar timers et les Monotonic timers. Chacun de ces types de timers répond à des besoins différents en matière de planification de tâches automatisées. Selon le cas d’utilisation, l’un ou l’autre peut être plus adapté.

OnCalendar Timers

Les OnCalendar timers permettent de programmer des tâches sur la base d’une date et d’une heure précises. Ils fonctionnent de manière similaire aux tâches cron, mais avec une syntaxe plus souple et compréhensible, comme “tous les lundis à 6h” ou “le premier jour de chaque mois à minuit”. Ces timers sont parfaits pour les tâches qui nécessitent une exécution planifiée, comme une sauvegarde quotidienne ou une analyse mensuelle.

Par exemple, pour un timer qui déclenche une tâche tous les jours à 6h, la configuration serait :

[Timer]
OnCalendar=*-*-* 6:00

Les OnCalendar timers utilisent une syntaxe flexible, permettant des combinaisons telles que :

  • Mon *-*-* 6:00 pour tous les lundis à 6h,
  • *-01-01 00:00 pour chaque 1er janvier à minuit.

Cette flexibilité rend les OnCalendar timers très utiles pour automatiser des tâches avec des conditions temporelles précises.

Monotonic Timers

Les Monotonic timers, en revanche, déclenchent des tâches après un certain intervalle à partir d’un événement donné, comme le démarrage du système ou l’activation d’un service. Ces timers sont utiles pour les tâches qui doivent se répéter régulièrement sans être associées à une date ou une heure fixe. Ils sont fréquemment utilisés pour des processus d’entretien, comme une vérification de l’état des services toutes les 5 minutes après le démarrage du système.

Les paramètres des Monotonic timers incluent :

  • OnBootSec : défini un délai après le démarrage du système,
  • OnUnitActiveSec : programme un intervalle après la dernière activation du timer.

Par exemple, pour un timer qui exécute une tâche toutes les 10 minutes après le démarrage :

[Timer]
OnBootSec=10min
OnUnitActiveSec=10min

Cette configuration exécutera la tâche au démarrage, puis toutes les 10 minutes par la suite. Les Monotonic timers sont particulièrement utiles pour des opérations répétitives qui ne nécessitent pas de planification fixe, comme la synchronisation régulière de données.

Choisir le bon type de Timer

En fonction des besoins, les OnCalendar timers conviennent mieux pour des actions programmées à des moments précis, tandis que les Monotonic timers sont idéaux pour des tâches répétées à intervalles. Grâce à ces deux types, Systemd Timers offrent une flexibilité accrue pour répondre à divers scénarios d’automatisation dans un environnement Linux.

Analyser un Timer existant

Avant de se lancer dans la créaion d’un nouveau timer, il est souvent utile d’analyser un timer existant pour comprendre comment il est configuré et comment il fonctionne. Nous allons utiliser le timer apt-daily.timer.

Le timer apt-daily est un Systemd Timer configuré par défaut sur les systèmes basés sur Debian et Ubuntu pour automatiser les mises à jour de paquets. Ce timer déclenche le service apt-daily.service, responsable de la mise à jour des listes de paquets, et apt-daily-upgrade.service, pour appliquer des mises à jour de sécurité. Dans ce chapitre, je vais vous montrer comment utiliser la commande systemctl pour vérifier, comprendre, et gérer ce timer.

La première étape pour comprendre le timer apt-daily consiste à vérifier son état avec la commande :

Terminal window
systemctl status apt-daily.timer
apt-daily.timer - Daily apt download activities
Loaded: loaded (/usr/lib/systemd/system/apt-daily.timer; enabled; preset: enabled)
Active: active (waiting) since Tue 2024-10-29 16:39:07 CET; 1 day 1h ago
Trigger: Wed 2024-10-30 18:05:12 CET; 19min left
Triggers: apt-daily.service
Oct 29 16:39:07 master1 systemd[1]: Started apt-daily.timer - Daily apt download activities.

Cette commande vous permet de voir des informations telles que la dernière exécution, l’état actuel, et le prochain déclenchement programmé du timer apt-daily.

Pour savoir exactement quand le timer apt-daily se déclenche, la commande suivante est utile :

Terminal window
systemctl list-timers apt-daily.timer
NEXT LEFT LAST PASSED UNIT ACTIVATES
Wed 2024-10-30 18:05:12 CET 18min Wed 2024-10-30 08:33:12 CET 9h ago apt-daily.timer apt-daily.service
1 timers listed.
Pass --all to see loaded but inactive timers, too.

Cette commande affiche les informations de planification pour apt-daily.timer ainsi que pour d’autres timers actifs, comme la dernière exécution et le moment prévu pour la prochaine. Vous verrez ainsi si apt-daily s’exécute quotidiennement ou à des intervalles particuliers.

Pour comprendre la configuration précise du timer apt-daily, vous pouvez consulter son fichier .timer dans /lib/systemd/system/apt-daily.timer. Utilisez un éditeur de texte ou une commande de lecture rapide comme cat :

Terminal window
cat /lib/systemd/system/apt-daily.timer

Le contenu devrait ressembler à ceci :

[Unit]
Description=Daily apt download activities
[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
  • OnCalendar=-- 6,18:00* indique que le timer est programmé pour s’exécuter deux fois par jour, à 6h et à 18h.
  • RandomizedDelaySec=12h signifie que le timer peut varier dans un intervalle de 12 heures pour éviter que les mises à jour de tous les systèmes se produisent au même moment, réduisant la charge des serveurs de mise à jour.

Le timer apt-daily déclenche le service apt-daily.service pour la mise à jour des listes de paquets. Pour vérifier l’état de ce service et s’assurer qu’il s’exécute correctement, utilisez :

Terminal window
systemctl status apt-daily.service
apt-daily.service - Daily apt download activities
Loaded: loaded (/usr/lib/systemd/system/apt-daily.service; static)
Active: inactive (dead) since Wed 2024-10-30 08:33:42 CET; 9h ago
TriggeredBy: apt-daily.timer
Docs: man:apt(8)
Process: 35498 ExecStartPre=/usr/lib/apt/apt-helper wait-online (code=exited, status=100)
Process: 35509 ExecStart=/usr/lib/apt/apt.systemd.daily update (code=exited, status=0/SUCCESS)
Main PID: 35509 (code=exited, status=0/SUCCESS)
CPU: 760ms
Oct 30 08:33:12 master1 systemd[1]: Starting apt-daily.service - Daily apt download activities...
Oct 30 08:33:42 master1 apt-helper[35498]: E: Le sous-processus nm-online a renvoyé un code d'erreur (1)
Oct 30 08:33:42 master1 systemd[1]: apt-daily.service: Deactivated successfully.
Oct 30 08:33:42 master1 systemd[1]: Finished apt-daily.service - Daily apt download activities.

Cette commande vous donne des informations sur l’exécution actuelle ou passée du service et si des erreurs ont été rencontrées.

Si vous souhaitez désactiver temporairement le timer apt-daily pour éviter qu’il ne se déclenche automatiquement, vous pouvez utiliser la commande suivante :

Terminal window
sudo systemctl stop apt-daily.timer

Pour empêcher le timer de se lancer automatiquement au démarrage, désactivez-le avec :

Terminal window
sudo systemctl disable apt-daily.timer

Pour réactiver le timer apt-daily et lui permettre de se lancer automatiquement au démarrage, utilisez les commandes :

Terminal window
sudo systemctl enable apt-daily.timer
sudo systemctl start apt-daily.timer

Ces commandes remettront le timer en état de fonctionnement avec la planification par défaut.

Pour diagnostiquer les erreurs ou vérifier les actions du service apt-daily, les journaux peuvent fournir des informations précieuses. Utilisez journalctl pour afficher les journaux du service :

Terminal window
journalctl -u apt-daily.service
-- Boot 6d1cc57e22d74248a862fe2cf487f198 --
Oct 30 03:27:12 master1 systemd[1]: Starting apt-daily.service - Daily apt download activities...
Oct 30 03:27:42 master1 apt-helper[23266]: E: Le sous-processus nm-online a renvoyé un code d'erreur (1)
Oct 30 03:27:56 master1 systemd[1]: apt-daily.service: Deactivated successfully.
Oct 30 03:27:56 master1 systemd[1]: Finished apt-daily.service - Daily apt download activities.
Oct 30 03:27:56 master1 systemd[1]: apt-daily.service: Consumed 11.910s CPU time.
Oct 30 08:33:12 master1 systemd[1]: Starting apt-daily.service - Daily apt download activities...
Oct 30 08:33:42 master1 apt-helper[35498]: E: Le sous-processus nm-online a renvoyé un code d'erreur (1)
Oct 30 08:33:42 master1 systemd[1]: apt-daily.service: Deactivated successfully.
Oct 30 08:33:42 master1 systemd[1]: Finished apt-daily.service - Daily apt download activities.

Cette commande montre les entrées de journal de chaque exécution du service apt-daily, notamment les mises à jour réussies, les mises à jour manquées et toute autre erreur qui pourrait avoir empêché l’exécution correcte.

Créer un Systemd Timer

Pour créer un Systemd Timer au niveau utilisateur, le processus est très similaire à la création d’un timer système, mais les fichiers de configuration sont placés dans le répertoire personnel de l’utilisateur, et les commandes sont exécutées sans privilèges root. Voici les étapes pour configurer et activer un Systemd Timer utilisateur.

Les Systemd Timers utilisateurs sont stockés dans le répertoire ~/.config/systemd/user/. Si ce répertoire n’existe pas, vous pouvez le créer avec la commande suivante :

Terminal window
mkdir -p ~/.config/systemd/user/

Dans le répertoire ~/.config/systemd/user/, créez un fichier .timer qui définira le moment où la tâche doit s’exécuter. Par exemple, pour créer un timer qui lance une tâche tous les jours à 7h du matin, vous pouvez utiliser le fichier daily-task.timer :

[Unit]
Description=Tâche quotidienne utilisateur
[Timer]
OnCalendar=*-*-* 7:00
Persistent=true
[Install]
WantedBy=default.target
  • OnCalendar=-- 7:00* définit l’heure d’exécution de la tâche, ici tous les jours à 7h.
  • Persistent=true permet au timer de rattraper les exécutions manquées si le système était hors ligne.
  • WantedBy=default.target garantit que le timer est activé dans l’environnement utilisateur.

Enregistrez ce fichier sous ~/.config/systemd/user/daily-task.timer.

Ensuite, créez un fichier .service correspondant dans le même répertoire pour spécifier la tâche à exécuter. Par exemple, daily-task.service :

[Unit]
Description=Exécution de la tâche quotidienne
[Service]
Type=oneshot
ExecStart=/chemin/vers/votre/script.sh
  • Type=oneshot indique que le service exécute une tâche unique puis se termine.
  • ExecStart= spécifie le chemin vers le script ou la commande que vous souhaitez exécuter.

Enregistrez ce fichier sous ~/.config/systemd/user/daily-task.service.

Pour prendre en compte les nouveaux fichiers, rechargez les unités systemd de l’utilisateur avec la commande suivante :

Terminal window
systemctl --user daemon-reload

Ensuite, activez le timer pour qu’il démarre automatiquement à chaque connexion de l’utilisateur :

Terminal window
systemctl --user enable daily-task.timer

Vous pouvez aussi démarrer le timer immédiatement pour vérifier qu’il fonctionne :

Terminal window
systemctl --user start daily-task.timer

Pour vérifier que le timer est correctement configuré et actif, utilisez :

Terminal window
systemctl --user status daily-task.timer
daily-task.timer - Tâche quotidienne utilisateur
Loaded: loaded (/home/bob/.config/systemd/user/daily-task.timer; enabled; preset: enabled)
Active: active (waiting) since Wed 2024-10-30 18:13:02 CET; 5s ago
Trigger: Thu 2024-10-31 07:00:00 CET; 12h left
Triggers: daily-task.service
Oct 30 18:13:02 master1 systemd[37741]: Started daily-task.timer - Tâche quotidienne utilisateur.

Cette commande vous permet de consulter l’état actuel du timer, la dernière exécution, et la prochaine planification.

Exemple d’utilisation des Timers utilisateurs

Les Systemd Timers au niveau utilisateur sont utiles pour des tâches telles que :

  • Des scripts de nettoyage dans le répertoire personnel.
  • Des notifications de rappels automatiques.
  • Des synchronisations de fichiers entre des dossiers locaux et distants.

Conclusion

Les Systemd Timers constituent une solution moderne et puissante pour l’automatisation des tâches sous Linux, surpassant les traditionnels cron jobs en offrant une intégration plus poussée avec les services systemd et en proposant des fonctionnalités avancées telles que la récupération des exécutions manquées, des options de conditions d’exécution, et une meilleure gestion des permissions.

Grâce à la flexibilité de leurs deux principaux types – les OnCalendar timers pour les tâches à horaires fixes et les Monotonic timers pour les intervalles basés sur des événements – les Systemd Timers permettent de configurer des automatisations précises, adaptées aux besoins spécifiques de chaque environnement. Qu’il s’agisse de tâches de sauvegarde, de nettoyage, de surveillance, ou même de mises à jour, ils offrent une solution fiable et robuste pour gérer les processus récurrents.

En maîtrisant les Systemd Timers, vous disposez d’un outil essentiel pour optimiser vos environnements Linux, réduire l’intervention manuelle, et assurer une maintenance efficace. Ce guide vous donne toutes les clés pour configurer et exploiter pleinement les timers dans vos projets d’administration système.