Systemd: Requiert vs veut


18

Y a-t-il une différence entre Requiert vs Veut dans les fichiers cibles?

[Unit]
Description=Graphical Interface 
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service

Merci


2
Voirman systemd.unit
heemayl

Réponses:


12

Comme l'a noté heemayl dans le commentaire, la page de manuel répond à votre question. Sur le Web:

Veut =

Une version plus faible de Requiert =. Les unités répertoriées dans cette option seront démarrées si l'unité de configuration l'est. Cependant, si les unités répertoriées ne démarrent pas ou ne peuvent pas être ajoutées à la transaction, cela n'a aucun impact sur la validité de la transaction dans son ensemble. Il s'agit de la méthode recommandée pour accrocher le démarrage d'une unité au démarrage d'une autre unité.

Et nécessite =:

Configure les dépendances des exigences sur d'autres unités. Si cette unité est activée, les unités répertoriées ici seront également activées. Si l'une des autres unités est désactivée ou que son activation échoue, cette unité sera désactivée. Cette option peut être spécifiée plusieurs fois ou plusieurs unités séparées par des espaces peuvent être spécifiées dans une option, auquel cas des dépendances d'exigence pour tous les noms répertoriés seront créées. Notez que les dépendances d'exigence n'influencent pas l'ordre dans lequel les services sont démarrés ou arrêtés. Ceci doit être configuré indépendamment avec les options After = ou Before =. Si une unité foo.service nécessite une unité bar.service configurée avec Requiert = et qu'aucune commande n'est configurée avec After = ou Before =, les deux unités seront démarrées simultanément et sans délai entre elles si foo.service est activé. Souvent,

Notez que ce type de dépendance n'implique pas que l'autre unité doit toujours être en état actif lorsque cette unité est en cours d'exécution. Plus précisément: l'échec des vérifications de condition (telles que ConditionPathExists =, ConditionPathExists =,… - voir ci-dessous) n'entraîne pas l'échec du travail de démarrage d'une unité avec une dépendance Requiert =. De plus, certains types d'unités peuvent se désactiver d'eux-mêmes (par exemple, un processus de service peut décider de quitter proprement, ou un périphérique peut être débranché par l'utilisateur), ce qui n'est pas propagé aux unités ayant une dépendance Requiert =. Utilisez le type de dépendance BindsTo = avec After = pour vous assurer qu'une unité ne peut jamais être en état actif sans une autre unité spécifique également en état actif (voir ci-dessous).

Depuis la page freedesktop.org

Votre service ne démarrera que si le multi-user.target a été atteint (je ne sais pas ce qui se passe si vous essayez de l'ajouter à cette cible?), Et systemd essaiera de démarrer le display-manager.service avant votre service . Si display-manager.service échoue pour une raison quelconque, votre service sera toujours démarré (donc si vous avez vraiment besoin du gestionnaire d'affichage, utilisez Requires=-le). Cependant, si le multi-user.target n'est pas atteint, votre service ne sera pas lancé.

Quel est votre service? Est-ce un système de kiosque? Intuitivement, je suppose que vous souhaitez ajouter votre service au multi-user.target (donc son lancement au démarrage), et le faire dépendre strictement du display-manager.service via Requires=display-manager.service. Mais c'est juste une supposition sauvage maintenant.


1

Notre déploiement de serveur utilise LDAP contenant tous les ID utilisateur et les cartes de montage automatique. Les répertoires personnels des utilisateurs sont montés NFS et les utilisateurs créent généralement des cronjobs @reboot avec le code exécutable dans leurs répertoires personnels. Nous utilisons également sssd pour le cache. Il va sans dire que nous comptons beaucoup sur la possibilité de fournir un ordre de démarrage déterministe pour que cette configuration fonctionne. Nous avons développé une configuration système très succincte, et nous avons découvert une nuance obscure entre les options de la section «veut» et «requiert».

Si vous avez un échec d'un service lors du démarrage et qu'il existe un autre service dépendant avec "requires" sur ce service avec "restart = always" défini comme option de service, ce service dépendant ne redémarrera pas. Si, cependant, vous avez "veut" en option, le service dépendant redémarrera, comme prévu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.