Comment créer et gérer les unités de temporisation systemd

Apprenez à exploiter la puissance des unités de temporisation systemd pour une planification de tâches efficace sous Linux. Ce guide propose une présentation complète de la création, de la configuration et de la gestion des unités `.timer` et `.service`, offrant des exemples pratiques pour les événements quotidiens, horaires et à des moments précis. Découvrez comment activer, démarrer, arrêter et surveiller vos tâches planifiées à l'aide de `systemctl` et `journalctl`, et comprenez les avantages par rapport aux tâches cron traditionnelles. Idéal pour les administrateurs système et les développeurs recherchant des solutions d'automatisation robustes.

45 vues

Maîtriser les unités de minuterie Systemd : Un guide complet

Systemd, le gestionnaire de système et de services omniprésent sous Linux, offre une alternative puissante et flexible aux tâches cron traditionnelles pour la planification des tâches. Les unités de minuterie Systemd (systemd timer units), une fonctionnalité intégrée directement dans l'écosystème systemd, offrent un contrôle accru, une meilleure intégration avec les services système et des capacités de journalisation plus granulaires. Ce guide vous accompagnera tout au long du processus de création, de gestion et de surveillance des unités de minuterie systemd, vous permettant d'automatiser les tâches avec assurance et efficacité.

Bien que cron soit la référence pour la planification des tâches depuis des décennies, les minuteries systemd offrent plusieurs avantages. Elles peuvent être directement liées à des unités de service, ce qui signifie qu'une minuterie peut activer un service uniquement lorsque le système est prêt, ou qu'un service peut être arrêté si une minuterie expire avant qu'il ne se termine. Cette intégration étroite simplifie la gestion complexe des dépendances. De plus, l'infrastructure de journalisation de systemd (journald) fournit un journal centralisé et consultable pour toutes les activités des minuteries, rendant le débogage nettement plus facile que de devoir parcourir des journaux cron dispersés.

Comprendre la structure des unités de minuterie Systemd

Une unité de minuterie systemd est toujours associée à une unité de service correspondante (ou un autre type d'unité) qu'elle est censée activer. L'unité de minuterie elle-même définit quand l'unité associée doit être activée, tandis que l'unité de service définit quelle action doit être effectuée. Les deux unités résident généralement dans le même répertoire, souvent /etc/systemd/system/ pour les unités personnalisées.

Un fichier d'unité de minuterie typique a l'extension .timer, et son fichier d'unité de service associé a l'extension .service. Par exemple, si vous souhaitez planifier une tâche définie dans mytask.service, vous créerez un fichier mytask.timer.

Exemple : Structure de mytask.timer

[Unit]
Description=Exécuter ma tâche personnalisée quotidiennement

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Décortiquons les sections clés :

  • Section [Unit] :

    • Description : Une description lisible par l'homme de la minuterie. Ceci est utile pour l'identification dans les sorties de statut.
  • Section [Timer] : C'est le cœur de l'unité de minuterie, définissant la planification.

    • OnCalendar=daily : Cette directive spécifie quand la minuterie doit s'activer. daily est un raccourci pour *-*-* 00:00:00. Systemd prend en charge un large éventail de spécifications d'événements calendaires, similaires à cron mais avec plus de flexibilité. Autres exemples :
      • hourly : Toutes les heures.
      • weekly : Toutes les semaines (équivalent à Mon *-*-* 00:00:00).
      • Sun *-*-* 10:00 : Chaque dimanche à 10 h (du matin).
      • *-*-15 14:30 : Le 15 de chaque mois à 14 h 30.
      • Mon..Fri *-*-* 09:00 : Les jours de semaine à 9 h (du matin).
    • Persistent=true : Si cette valeur est définie sur true, la minuterie s'activera dès que possible si l'événement s'est produit pendant que le système était éteint. Pour les minuteries OnCalendar, cela signifie que si le système était éteint pendant l'heure prévue, la minuterie se déclenchera une fois que le système aura démarré et que la minuterie sera devenue active.
    • OnBootSec= : Active la minuterie un temps spécifié après le démarrage du système. Par exemple, OnBootSec=15min se déclencherait 15 minutes après le démarrage.
    • OnUnitActiveSec= : Active la minuterie un temps spécifié après la dernière activation de l'unité qu'elle active (par exemple, le service). Par exemple, OnUnitActiveSec=1h se déclencherait une heure après la fin de l'exécution du service associé.
    • OnUnitInactiveSec= : Active la minuterie un temps spécifié après la dernière désactivation de l'unité qu'elle active.
    • AccuracySec= : Spécifie la précision de la minuterie. Systemd essaie de réveiller le système pour les minuteries uniquement si l'événement se situe dans cette fenêtre de temps, aidant ainsi à économiser l'énergie. La valeur par défaut est 1min.
    • RandomizedDelaySec= : Ajoute un délai aléatoire au déclenchement de la minuterie, jusqu'à la durée spécifiée. Utile pour distribuer la charge.
  • Section [Install] : Cette section définit comment l'unité de minuterie peut être activée (enabled).

    • WantedBy=timers.target : Cette directive garantit que lorsque la minuterie est activée, elle fait partie de timers.target, qui est une cible standard incluant toutes les minuteries actives. Cela signifie que la minuterie démarrera automatiquement au démarrage du système une fois activée.

Exemple : Structure de mytask.service

[Unit]
Description=Mon service de tâche personnalisée

[Service]
Type=oneshot
ExecStart=/usr/local/bin/my_custom_script.sh
User=myuser
Group=mygroup

[Install]
WantedBy=multi-user.target
  • Section [Unit] :

    • Description : Une description du service.
  • Section [Service] : Ceci définit le service lui-même.

    • Type=oneshot : Convient aux tâches qui s'exécutent une fois puis se terminent. D'autres types existent pour les démons de longue durée.
    • ExecStart : La commande à exécuter. Assurez-vous que le script dispose des permissions d'exécution.
    • User/Group : Spécifie l'utilisateur et le groupe sous lesquels la commande doit s'exécuter. Il est recommandé de ne pas exécuter les tâches en tant que root, sauf nécessité absolue.
  • Section [Install] : Cette section est généralement présente pour les services qui doivent être démarrés au démarrage, bien que pour un service déclenché par une minuterie, cela puisse ne pas être strictement nécessaire s'il n'est destiné à être démarré que par la minuterie.

Création et activation des unités de minuterie

Suivez ces étapes pour créer et gérer vos unités de minuterie systemd :

  1. Créer le fichier d'unité de service : Définissez votre tâche dans un fichier .service. Placez-le dans /etc/systemd/system/ (ou ~/.config/systemd/user/ pour les minuteries spécifiques à l'utilisateur).
    bash sudo nano /etc/systemd/system/mytask.service
    Collez le contenu du service d'exemple ci-dessus et enregistrez.

  2. Créer le fichier d'unité de minuterie : Définissez le calendrier dans un fichier .timer correspondant. Placez-le dans le même répertoire que le fichier de service.
    bash sudo nano /etc/systemd/system/mytask.timer
    Collez le contenu de la minuterie d'exemple ci-dessus et enregistrez.

  3. Recharger le démon Systemd : Après avoir créé ou modifié des fichiers d'unité, vous devez indiquer à systemd de recharger sa configuration.
    bash sudo systemctl daemon-reload

  4. Activer la minuterie (Enable) : Pour que la minuterie démarre automatiquement au démarrage, activez-la.
    bash sudo systemctl enable mytask.timer
    Remarque : Vous NE DEVEZ PAS activer (enable) le fichier de service s'il est uniquement destiné à être déclenché par la minuterie.

  5. Démarrer la minuterie (Start) : Démarrez la minuterie immédiatement. Elle s'exécutera ensuite selon son calendrier.
    bash sudo systemctl start mytask.timer

Gestion et surveillance des unités de minuterie

Systemd fournit plusieurs commandes systemctl pour gérer et surveiller vos minuteries :

  • Lister toutes les minuteries : Voir toutes les minuteries actives et inactives.
    bash systemctl list-timers
    Cette commande fournit une sortie telle que :
    NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2023-10-27 08:00:00 UTC 10h left Wed 2023-10-26 08:00:00 UTC 14h ago mytask.timer mytask.service
    Ceci indique quand la minuterie est programmée pour s'exécuter ensuite, le temps restant avant son exécution, quand elle a été exécutée pour la dernière fois et quel service elle active.

  • Lister les minuteries pour une unité spécifique : Si vous souhaitez voir les minuteries liées à un service spécifique.
    bash systemctl list-timers --all | grep mytask.service

  • Vérifier le statut de la minuterie : Obtenez des informations détaillées sur une minuterie spécifique.
    bash systemctl status mytask.timer
    Ceci indiquera si la minuterie est active, quand elle est programmée pour s'exécuter ensuite, et les entrées de journal récentes.

  • Afficher les journaux de service : Pour voir la sortie et le statut de la tâche exécutée par la minuterie, vérifiez les journaux du service associé.
    bash journalctl -u mytask.service
    Vous pouvez également suivre les journaux en temps réel :
    bash journalctl -f -u mytask.service

  • Arrêter une minuterie : Si vous devez désactiver temporairement une minuterie.
    bash sudo systemctl stop mytask.timer

  • Désactiver une minuterie : Pour empêcher une minuterie de démarrer au démarrage et l'arrêter si elle est en cours d'exécution.
    bash sudo systemctl disable mytask.timer

Configurations avancées de minuterie

Définir des intervalles spécifiques

Au lieu de daily ou hourly, vous pouvez définir des intervalles plus précis :

  • Toutes les N minutes : OnUnitActiveSec=15min (s'exécute 15 minutes après la dernière fin du service).
  • Heures spécifiques : OnCalendar=*-*-* 02:30:00 (s'exécute quotidiennement à 2 h 30 du matin).
  • Combinaison de conditions : OnCalendar=Mon..Fri *-*-* 08:00:00 (s'exécute les jours de semaine à 8 h du matin).

Utilisation de AccuracySec pour l'économie d'énergie

Si votre tâche n'a pas besoin de s'exécuter à un moment précis, envisagez d'utiliser AccuracySec. Par exemple, AccuracySec=5min indique à systemd qu'il est acceptable de réveiller le système dans les 5 minutes suivant l'heure prévue. Cela permet à systemd de regrouper les événements de minuterie et potentiellement de maintenir le système dans un état de faible consommation d'énergie plus longtemps.

[Timer]
OnCalendar=hourly
AccuracySec=5min

Persistent vs. WakeUpOn

  • Persistent=true garantit que si un événement OnCalendar est manqué parce que le système était éteint, il s'exécutera une fois lors du prochain démarrage. Ceci est crucial pour les tâches qui ne doivent pas être ignorées.
  • WakeUpOn= (par exemple, WakeUpOn=battery, WakeUpOn=ac) peut être utilisé pour spécifier les conditions dans lesquelles le système doit se réveiller pour les minuteries. Ceci est plus avancé et souvent utilisé conjointement avec systemd-suspend.service.

Minuteries vs. Cron

Fonctionnalité Minuteries Systemd Cron
Intégration Intégration profonde avec les services systemd, les cibles Utilitaire autonome
Planification Flexible (calendrier, relative, basée sur le démarrage) Expressions basées principalement sur l'heure
Journalisation Centralisée via journalctl Dispersée (/var/log/syslog, /var/log/cron.log)
Gestion des erreurs Peut lier des actions aux échecs de service Notifications de courrier électronique de base
Dépendances Peut dépendre de l'activation d'autres services Limitée
Exécution Peut s'exécuter en tant qu'utilisateurs, groupes spécifiques Peut s'exécuter en tant qu'utilisateurs spécifiques via crontab
Gestion de l'énergie Peut être optimisée pour l'économie d'énergie (AccuracySec) Contrôle moins direct

Quand choisir les minuteries Systemd :

  • Lorsque vous avez besoin d'une intégration plus étroite avec d'autres services systemd.
  • Lorsque la journalisation centralisée et un débogage plus facile sont des priorités.
  • Lorsque vous avez besoin d'options de planification plus avancées (par exemple, temps écoulé depuis la dernière exécution).
  • Pour les tâches liées à l'état du système ou à la gestion de l'énergie.

Quand Cron pourrait encore être préféré :

  • Pour les tâches très simples et autonomes sur des systèmes n'adoptant pas entièrement systemd.
  • Pour une compatibilité maximale entre les différentes distributions Linux et les systèmes plus anciens.

Dépannage des problèmes courants

  • La tâche ne s'exécute pas :
    • Vérifiez le statut de la minuterie : systemctl status mytask.timer. Recherchez les messages Active: active et Triggered....
    • Vérifiez les journaux de service : journalctl -u mytask.service. Assurez-vous que le script est exécutable et ne contient pas d'erreurs.
    • Vérifiez la syntaxe OnCalendar : Utilisez systemd-analyze calendar 'votre-chaîne-de-calendrier' pour tester.
    • Assurez-vous que la minuterie est activée (enabled) et démarrée (started) : systemctl list-timers --all.
  • La tâche s'exécute trop tôt/trop tard :
    • Vérifiez AccuracySec et RandomizedDelaySec.
    • Assurez-vous que l'horloge système est précise (timedatectl status).
  • Erreurs de permission :
    • Confirmez que l'User et le Group spécifiés dans le fichier .service disposent des autorisations nécessaires pour le script et tous les fichiers auxquels il accède.
    • Si aucun utilisateur n'est spécifié, la valeur par défaut est root. Soyez prudent avec les privilèges root.

Conclusion

Les unités de minuterie Systemd offrent une approche robuste et moderne de la planification des tâches sur les systèmes Linux. En comprenant leur structure, leur création et leur gestion, vous pouvez automatiser efficacement les opérations de routine, améliorer la fiabilité du système et exploiter toute la puissance de l'écosystème systemd. N'oubliez pas de toujours recharger le démon après les modifications, d'activer la minuterie pour la persistance, et d'utiliser journalctl pour une surveillance et un dépannage efficaces.