9 votes

Comment configurer plusieurs services systemd pour utiliser un seul timer ?

J'ai remarqué une variation significative de l'approche dans certaines documentations systemd et dans des documents pratiques concernant la façon de configurer un ou plusieurs services pour utiliser le même timer.

D'après ce que j'ai pu comprendre (mais je peux me tromper), ceci décrirait ce que l'on appelle la WantedBy y Unité Les paramètres d'un fichier de service et de temporisation doivent être définis (sans utiliser d'exemples de code réels ici - afin de réduire la longueur du post) pour un service unique et, inversement, pour une configuration de plusieurs services utilisant une seule temporisation :

Minuterie pour un seul service

My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3) 

(1) Le fichier de service n'a pas besoin d'une section [Install] avec un paramètre WantedBy.

(2) Dans la section [Timer] de la minuterie, le paramètre Unit doit pointer vers le fichier de service My.Service1.

(3) Le fichier de temporisation possède un paramètre WantedBy qui pointe vers une cible système spéciale qui sera utilisée pour le démarrer.

Minuterie pour plusieurs services

My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???

(1) Les services doivent tous se connecter à la même cible définie à l'aide du paramètre WantedBy.

(2) Le paramètre Unité [Timer] doit également pointer vers la cible.

Pour un exemple de cette dernière configuration, voir ce mode d'emploi . Je vais considérer cela comme l'exemple 1. Cependant, j'ai trouvé d'autres exemples de mode d'emploi qui s'en écartent (voir ci-dessous).

Exemple 2 y Exemple 3 disons qu'il devrait être configuré comme ceci :

My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target

(1) Il doit s'agir d'un oubli dans la documentation parce que si vous laissez l'unité pointer vers un seul de vos multiples services, les autres les autres services ne peuvent pas utiliser le timer. Il est possible que cela soit dû à l'approche "voir ci-dessus" utilisée ici pour renvoyer le lecteur à la configuration du service unique sans réellement mentionner (de manière importante) ce qui doit être modifié.

Ensuite, avec Exemple 4 sa configuration semble fonctionner, mais il s'agit de connecter les services à la cible d'une manière différente en créant les fichiers de service directement sous le nom de l'utilisateur. /etc/systemd/system/Timer.Target.wants/ et exclut tout paramètre WantedBy dans les fichiers de service. Ainsi :

My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target

Une approche hybride entre les exemples 1 et 4 que j'ai vue consiste à créer les fichiers de service dans le dossier de l'utilisateur. /etc/systemd/system/ (l'emplacement par défaut) et de créer un lien symbolique vers ces fichiers de service sous le répertoire /etc/systemd/system/Timer.Target.wants et exclure un paramètre WantedBy dans le fichier de service (ce qui est fonctionnellement équivalent à l'exemple 4), tandis qu'une autre configuration utilise la méthode du lien symbolique mais inclut en plus le paramètre WantedBy dans le fichier de service (ce qui semble redondant et inutile).

Ma question serait cependant la suivante pour les approches de l'exemple 4 et hybride : Pourquoi mettre quelque chose sous un *.veut n'est pas du tout nécessaire si la déclaration d'un paramètre WantedBy est censée demander à systemd de le faire pour vous (comme indiqué dans l'explication de ce paramètre à la page cette page ) ?

Quelqu'un peut-il nous éclairer sur la meilleure façon de configurer plusieurs services à l'aide d'une même minuterie parmi la multiplicité déroutante des approches pour y parvenir ?

0 votes

Laquelle vous convient le mieux ? J'ai créé ces services et ces timers dans /usr/lib/systemd et j'utilise systemctl --user start mytimer.timer ...il crée des liens symboliques sous ~/.config/systemd/user

9voto

Si vous souhaitez activer plusieurs services avec une seule minuterie, insérez une cible entre les deux :

L'unité de minuterie, appelons-la foo.timer :

[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target

[Timer]
OnCalendar=Sat 9:00
Unit=foo.target

[Install]
WantedBy=timers.target

L'unité cible, appelons-la foo.target :

[Unit]
Description= My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service

[Install]
Also=foo.timer

Puis les deux services xxx.service et yyy.service :

[Unit]
Description=My service XXX

[Service]
ExecStart=/bin/echo I am XXX

[Install]
Also=foo.timer

[Unit]
Descritpion=My service YYY

[Service]
ExecStart=/bin/echo I am YYYY

[Install]
Also=foo.timer

Copiez ces quatre fichiers unitaires (foo.timer, foo.target, xxx.service, yyy.service) dans /etc/systemd/systemd/. Ensuite, activez et démarrez le timer en lançant "systemctl enable --now foo.timer". Cela accrochera foo.timer à timers.target, qui est la cible générique censée rassembler tous les différents timers définis sur un système. Notez que vous pourriez aussi bien faire "systemctl enable foo.target", et aussi "systemctl enable zzz.service", puisque les lignes Also= dans ces unités propagent les requêtes d'activation vers foo.timer.

1voto

Mark Stosberg Points 3665

Un timer systemd active toujours une unité.

Si vous souhaitez activer deux unités selon la même programmation, je vous recommande de créer deux fichiers de programmation pour la clarté qui contiennent la même programmation.

Sinon, vous pouvez créer un fichier "unité de service" qui lance les deux services que vous souhaitez.

Je ne pense pas que "WantedBy=" soit un concept particulièrement utile pour les unités de temporisation.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X