5 fonctionnalités peu connues des minuteries systemd
Sommaire
Points clés à retenir
- Les minuteries systemd ont des contrôles internes pour empêcher plusieurs instances de s'exécuter simultanément, évitant ainsi les conflits de ressources.
- Activez la résolution d'une seconde dans les minuteries systemd pour augmenter la précision par rapport à la résolution d'une minute par défaut.
- Faites-vous signaler les pannes via le support de votre choix. Lancez immédiatement les minuteries et les services pour faciliter le débogage.
Les minuteries systemd de Linux disposent d'un ensemble de fonctionnalités riches et sophistiquées. Les fonctionnalités de base gèrent les scénarios les plus courants, mais vous risquez de manquer certaines fonctionnalités intéressantes comme ces options peu connues.
La minuterie système
La minuterie systemd est le remplacement moderne de l'ancienne commande cron. Les deux commandes vous permettent de planifier le lancement d'une tâche ou d'un processus à une certaine heure ou à une certaine fréquence. Les avantages des minuteries systemd sont plus de contrôle, plus de flexibilité et une résolution plus élevée que les minuteries cron.
D'après les commentaires et les questions que je reçois lorsque j'en parle, les timers systemd pourraient être l'un des éléments les plus mal compris de Linux. Même lorsque je parle à des personnes qui préfèrent les minuteries systemd, elles ne connaissent souvent pas tout ce qui figure sur cette liste.
À première vue, les minuteries systemd peuvent sembler difficiles. Il y a une nouvelle syntaxe de configuration à apprendre, que beaucoup trouvent rebutante. Et vous ne créez pas simplement un seul fichier de configuration. Chaque minuterie a besoin de deux fichiers distincts, mais liés.
À première vue, les minuteries systemd peuvent sembler compliquées, ou réservées aux techniciens. Mais ce n'est vraiment pas si mal. C'est dommage que certaines personnes les évitent et s'en tiennent à cron, car les timers systemd ont beaucoup d'astuces intéressantes dans leurs manches bien garnies.
1. Une instance à la fois
Le premier avantage des minuteries systemd vient automatiquement. Vous n'avez rien à faire pour en profiter. Il existe des contrôles internes qui empêchent le déclenchement d'un minuteur si une exécution précédente du même minuteur n'est pas encore terminée.
Cela évite les conflits de ressources et évite le type de problèmes qui peuvent survenir si, par exemple, deux tâches de sauvegarde tentent de s'exécuter en même temps.
Les minuteries qui ne fonctionnent pas ne sont pas supprimées. Ils sont prêts et lancés une fois le chronomètre écoulé. Ceci est important car le lancement séquentiel des timers convient parfaitement. Il s’agit d’une exécution simultanée non planifiée qui peut produire des effets secondaires inattendus.
2. Activez la synchronisation de deuxième résolution
Avec cron, vous pouvez planifier des tâches avec une résolution d'une minute. Désormais, avec les minuteries système, vous pouvez programmer des minuteries pour qu'elles se déclenchent avec une résolution d'une seconde. En fait, vous pouvez utiliser une résolution de l’ordre de la microseconde mais, en dehors de scénarios spécialisés en temps réel, il est difficile d’imaginer quand vous auriez besoin de l’utiliser.
Mais voici le problème. Les minuteries systemd ont par défaut une résolution d'une minute. Vous devez activer la précision d'une résolution à une seconde comme celle-ci.
(Timer)
AccuracySec=1
3. Utilisez des événements monotones pour une exécution retardée
Les minuteries systemd disposent d'un ensemble complet et flexible de méthodes de planification.
Les événements du calendrier sont déclenchés à une heure particulière, un jour ou un ensemble de jours particuliers, et à une heure spécifique. Vous pouvez avoir plusieurs spécificateurs d'heure pour une minuterie, afin de vous donner des heures de lancement différentes le week-end et en semaine. Il est également possible de ne pas spécifier d'heure, ce qui signifie en fait « à tout moment de la journée ».
Les événements monotones sont déclenchés après une durée spécifiée suite à un événement, tel que le démarrage du système. Vous pouvez également configurer une minuterie pour qu'elle se déclenche à un moment donné après son activation ou, étonnamment, sa désactivation.
Pour qu'un service s'exécute 45 secondes après le démarrage du PC, utilisez ce format :
(Timer)
OnBootSec=45 seconds
Une autre astuce intéressante consiste à déclencher la minuterie si l'heure ou la date est modifiée dans l'horloge système du PC.
(Timer)
OnClockChange=true
4. Déclenchez manuellement des tâches chronométrées
Lorsque je développe une minuterie, j'aime le faire par étapes. Tout d’abord, assurez-vous que le processus cible que vous allez lancer fonctionne comme un processus autonome. Cela signifie que le programme, le script ou la commande Linux que vous avez l'intention de lancer doit fonctionner comme prévu lorsque vous utilisez la commande dans une fenêtre de terminal.
Deuxièmement, je crée le fichier de service et y mets cette commande. Enfin, je crée le fichier timer qui lance le fichier de service.
Pour tester votre minuterie, vous pouvez la configurer pour qu'elle se déclenche quelques minutes plus tard et attendre. Cela fonctionne, mais si vous devez le faire plusieurs fois pour que les choses fonctionnent, ajuster la ligne OnCalendar= à chaque fois que vous effectuez une modification devient vite fastidieux.
Vous pouvez lancer votre minuterie manuellement chaque fois que vous souhaitez qu'elle s'exécute.
sudo systemctl start name-of-your.timer
Cela fonctionne, mais vous devez garder à l'esprit que cela lance votre minuteur. Mais si votre ligne OnCalendar= demande au minuteur de lancer le service le premier mercredi du mois, vous devrez attendre que cela se produise avant que le service ne soit déclenché.
Si ce que vous souhaitez réellement tester, c'est l'exécution du service, démarrez le service plutôt.
sudo systemctl start name-of-your.service
Il existe également une commande d'arrêt correspondante.
sudo systemctl stop name-of-your.service
Notez que si les unités RefuseManualStart ou RefuseManualStop sont incluses dans votre fichier de service et définies sur Oui, vous ne pourrez pas démarrer ou arrêter manuellement le service. Mais si vous déboguez un timer systemd que vous avez créé vous-même, vous ne les avez probablement pas inclus. Si nécessaire, vous pouvez les commenter pendant que vous testez.
5. Signaler automatiquement les services défaillants
La directive MAILTO était l'une des fonctionnalités les plus sophistiquées de cron. Vous avez fourni une adresse e-mail pour recevoir des notifications d'erreurs ou d'échecs. L'équivalent systemd est légèrement plus compliqué, mais il offre plus de flexibilité. Il n'est pas nécessaire que la méthode de notification soit le courrier électronique. Vous pouvez tout aussi bien envoyer une notification à une chaîne Slack, par exemple.
L'astuce consiste à déclencher un autre service et à avoir que Le service lance le processus qui envoie la notification.
Dans votre fichier de service, incluez la directive OnFailure= et définissez-la sur le nom de votre service de rapport d'erreurs. Le nom de votre service de notification doit se terminer par le signe arobase « @ » pour indiquer qu'il s'agit d'un service modèle.
(Unit)
OnFailure=notify-error@%n.service
Notre service de reporting s'appelle « notify-error@.service ». S'il y a une panne et que ce service est appelé, le nom du appel Le service est ajouté après le « @ », en remplacement du jeton « %n ». Ce nom peut être récupéré dans notify-error@.service en tant que jeton « %i ».
Notre notify-error@.service contient :
(Unit)
Description=Report systemd timer errors(Service)
Type=oneshot
ExecStart=/usr/local/bin/send-to-slack.sh %i
(Install)
WantedBy=multi-user.target
Lorsque ce service est déclenché, le nom du service appelant est accessible via la variable « %i ». Sur ma machine, ceci est transmis à un fichier de script appelé « send-to-slack.sh » qui compose le message et l'envoie à Slack. La ligne ExecStart= peut pointer vers n'importe quelle commande, programme ou script que vous avez sur votre ordinateur.
Et enfin
Un dernier conseil consiste à utiliser l'outil systemd-analyze avec son option de calendrier pour vérifier et normaliser les dates et heures à utiliser dans les instructions OnCalendar dans votre fichier de minuterie.
Par exemple, pour qu'une minuterie soit déclenchée à 13h15 tous les jours, indiquez l'heure sur la commande dans un format simple et demandez à systemd-analyze de générer la version normalisée pour vous.
systemd-analyze calendar 13:15
Le format normalisé est celui à utiliser dans votre fichier timer.