Comment créer et gérer les unités de temporisation systemd
Créez, activez, surveillez et dépannez les unités de temporisation systemd avec des exemples pratiques de `.timer`, `.service`, `systemctl` et `journalctl`.
Comment créer et gérer des unités de temporisation Systemd
Les unités de temporisation Systemd planifient des tâches sur Linux sans dépendre de cron. Si votre serveur doit exécuter une sauvegarde, un nettoyage, une vérification de santé ou un rapport à un moment prévisible, une temporisation systemd vous offre la planification, l'isolation des services, la gestion des dépendances et les journaux en un seul endroit.
L'idée clé est simple : le fichier .timer indique quand exécuter, et le fichier .service indique quoi exécuter. Cette séparation rend les temporisations faciles à inspecter avec systemctl et faciles à déboguer avec journalctl.
Comprendre la structure d'une unité de temporisation Systemd
Une unité de temporisation 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 temporisation elle-même définit quand l'unité associée doit être activée, tandis que l'unité de service définit quelle action effectuer. 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 temporisation 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éeriez un fichier mytask.timer.
Exemple : mytask.timer
[Unit]
Description=Exécuter ma tâche personnalisée quotidiennement
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Détaillons les sections clés :
Section
[Unit]:Description: Une description lisible par l'homme de la temporisation. Utile pour l'identification dans les sorties d'état.
Section
[Timer]: C'est le cœur de l'unité de temporisation, définissant la planification.OnCalendar=daily: Cette directive spécifie quand la temporisation doit s'activer.dailyest un raccourci pour minuit chaque jour. D'autres exemples incluent :hourly: Toutes les heures.weekly: Toutes les semaines (équivalent àMon *-*-* 00:00:00).Sun *-*-* 10:00: Tous les dimanches à 10h.*-*-15 14:30: Le 15 de chaque mois à 14h30.Mon..Fri *-*-* 09:00: En semaine à 9h.
Persistent=true: Si défini surtrue, la temporisation s'activera dès que possible si l'événement s'est produit alors que le système était éteint. Pour les temporisationsOnCalendar, cela signifie que si le système était éteint pendant l'heure planifiée, la temporisation se déclenchera une fois que le système démarrera et que la temporisation deviendra active.OnBootSec=: Active la temporisation un temps spécifié après le démarrage du système. Par exemple,OnBootSec=15minse déclencherait 15 minutes après le démarrage.OnUnitActiveSec=: Active la temporisation un temps spécifié après que l'unité qu'elle active est devenue active pour la dernière fois. Par exemple,OnUnitActiveSec=1hplanifie une autre exécution une heure après la dernière activation du service associé.OnUnitInactiveSec=: Active la temporisation un temps spécifié après que l'unité qu'elle active est devenue inactive pour la dernière fois.AccuracySec=: Spécifie la précision de la temporisation. Systemd essaie de réveiller le système pour les temporisations uniquement si l'événement se situe dans cette fenêtre de temps, ce qui permet d'économiser de l'énergie. Par défaut à1min.RandomizedDelaySec=: Ajoute un délai aléatoire au déclenchement de la temporisation, jusqu'à la durée spécifiée. Utile pour répartir la charge.
Section
[Install]: Cette section définit comment l'unité de temporisation peut être activée.WantedBy=timers.target: Cette directive garantit que lorsque la temporisation est activée, elle fait partie detimers.target, qui est une cible standard incluant toutes les temporisations actives. Cela signifie que la temporisation démarrera automatiquement au démarrage une fois activée.
Exemple : mytask.service
[Unit]
Description=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]: Elle définit le service lui-même.Type=oneshot: Adapté aux tâches qui s'exécutent une fois puis se terminent. D'autres types existent pour les démons longue durée.ExecStart: La commande à exécuter. Assurez-vous que le script a les permissions d'exécution.User/Group: Spécifie l'utilisateur et le groupe sous lesquels la commande doit s'exécuter. Il est de bonne pratique de ne pas exécuter les tâches en tant que root sauf si absolument nécessaire.
Section
[Install]: Cette section n'est généralement pas nécessaire pour un service oneshot qui ne doit être démarré que par une temporisation. Activez la temporisation, pas le service.
Créer et activer des unités de temporisation
Suivez ces étapes pour créer et gérer vos unités de temporisation systemd :
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 temporisations spécifiques à l'utilisateur).sudo nano /etc/systemd/system/mytask.serviceCollez le contenu de l'exemple de service ci-dessus et enregistrez.
Créer le fichier d'unité de temporisation : Définissez la planification dans un fichier
.timercorrespondant. Placez-le dans le même répertoire que le fichier de service.sudo nano /etc/systemd/system/mytask.timerCollez le contenu de l'exemple de temporisation ci-dessus et enregistrez.
Recharger le démon Systemd : Après avoir créé ou modifié des fichiers d'unité, vous devez dire à systemd de recharger sa configuration.
sudo systemctl daemon-reloadActiver la temporisation : Pour que la temporisation démarre automatiquement au démarrage, activez-la.
sudo systemctl enable mytask.timerRemarque : Vous n'activez PAS le fichier de service s'il est uniquement destiné à être déclenché par la temporisation.
Démarrer la temporisation : Démarrez la temporisation immédiatement. Elle s'exécutera ensuite selon son calendrier.
sudo systemctl start mytask.timer
Gérer et surveiller les unités de temporisation
Systemd fournit plusieurs commandes systemctl pour gérer et surveiller vos temporisations :
Lister toutes les temporisations : Voir toutes les temporisations actives et inactives.
systemctl list-timersCette commande fournit une sortie comme :
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.serviceCela montre quand la temporisation est programmée pour s'exécuter ensuite, combien de temps avant son exécution, quand elle s'est exécutée pour la dernière fois et quel service elle active.
Lister les temporisations pour une unité spécifique : Si vous voulez voir les temporisations liées à un service spécifique.
systemctl list-timers --all | grep mytask.serviceVérifier l'état de la temporisation : Obtenir des informations détaillées sur une temporisation spécifique.
systemctl status mytask.timerCela montrera si la temporisation est active, quand elle est programmée pour s'exécuter ensuite et les entrées de journal récentes.
Voir les journaux du service : Pour voir la sortie et l'état de la tâche exécutée par la temporisation, vérifiez les journaux du service associé.
journalctl -u mytask.serviceVous pouvez également suivre les journaux en temps réel :
journalctl -f -u mytask.serviceArrêter une temporisation : Si vous devez désactiver temporairement une temporisation.
sudo systemctl stop mytask.timerDésactiver une temporisation : Pour empêcher une temporisation de démarrer au démarrage et l'arrêter si elle est en cours d'exécution.
sudo systemctl disable --now mytask.timer
Configurations avancées des temporisations
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 activation du service). - Heures spécifiques :
OnCalendar=*-*-* 02:30:00(s'exécute quotidiennement à 2h30). - Combinaison de conditions :
OnCalendar=Mon..Fri *-*-* 08:00:00(s'exécute en semaine à 8h).
Utiliser AccuracySec pour économiser l'é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 temporisation et potentiellement de maintenir le système dans un état de faible consommation plus longtemps.
[Timer]
OnCalendar=hourly
AccuracySec=5min
Persistent vs. WakeSystem
Persistent=truegarantit que si un événementOnCalendarest manqué en raison de l'extinction du système, il s'exécutera une fois au prochain démarrage. Ceci est crucial pour les tâches qui ne doivent pas être sautées.WakeSystem=truedemande à systemd de réveiller le système de la suspension pour la temporisation si le système et le matériel le supportent. Ce n'est pas la même chose que de décider si la machine est sur secteur ou sur batterie.
Temporisations vs. Cron
| Fonctionnalité | Temporisations Systemd | Cron |
|---|---|---|
| Intégration | Intégration profonde avec les services systemd, cibles | Utilitaire autonome |
| Planification | Flexible (calendrier, relatif, basé sur le démarrage) | Expressions principalement basées sur le temps |
| Journalisation | Centralisée via journalctl |
Dispersée (/var/log/syslog, /var/log/cron.log) |
| Gestion d'erreurs | Peut lier des actions aux échecs de service | Notifications par e-mail de base |
| Dépendances | Peut dépendre d'autres services actifs | 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 d'énergie | Peut être optimisée pour économiser l'énergie (AccuracySec) |
Moins de contrôle direct |
Quand choisir les temporisations 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 prioritaires.
- Lorsque vous avez besoin d'options de planification plus avancées (par exemple, temps 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 des tâches très simples et autonomes sur des systèmes n'utilisant pas pleinement systemd.
- Pour une compatibilité maximale entre différentes distributions Linux et systèmes plus anciens.
Dépannage des problèmes courants
- La tâche ne s'exécute pas :
- Vérifiez l'état de la temporisation :
systemctl status mytask.timer. Recherchez les messagesActive: activeetTriggered.... - Vérifiez les journaux du service :
journalctl -u mytask.service. Assurez-vous que le script est exécutable et sans erreurs. - Vérifiez la syntaxe
OnCalendar: Utilisezsystemd-analyze calendar 'votre-chaîne-calendrier'pour tester. - Assurez-vous que la temporisation est activée et démarrée :
systemctl list-timers --all.
- Vérifiez l'état de la temporisation :
- La tâche s'exécute trop tôt/tard :
- Vérifiez
AccuracySecetRandomizedDelaySec. - Assurez-vous que l'horloge système est précise (
timedatectl status).
- Vérifiez
- Erreurs de permission :
- Confirmez que l'
Useret leGroupspécifiés dans le fichier.serviceont les permissions nécessaires pour le script et tous les fichiers auxquels il accède. - Si aucun utilisateur n'est spécifié, il est par défaut root. Soyez prudent avec les privilèges root.
- Confirmez que l'
Conclusion
Utilisez une temporisation systemd lorsque la tâche appartient à la couche de service de la machine : sauvegardes, tâches de nettoyage, vérifications de surveillance, hooks de renouvellement de certificat et autres travaux opérationnels. Créez d'abord le service, créez ensuite la temporisation, exécutez systemctl daemon-reload, activez et démarrez la temporisation, puis vérifiez-la avec systemctl list-timers --all et journalctl -u votre.service.