Suivant: Référence de service, Précédent: Composition de services, Monter: Définir des services [Table des matières][Index]
Un type de service est un nœud dans le DAG décrit plus haut.
Commençons avec un exemple simple, le type de service pour le démon de
construction de Guix (voir Invoquer guix-daemon
) :
(define guix-service-type
(service-type
(name 'guix)
(extensions
(list (service-extension shepherd-root-service-type guix-shepherd-service)
(service-extension account-service-type guix-accounts)
(service-extension activation-service-type guix-activation)))
(default-value (guix-configuration))))
Il définit trois choses :
Chaque type de service a au moins une extension de service. La seule exception est le type de service boot, qui est le service ultime.
Dans cet exemple, guix-service-type étend trois services :
shepherd-root-service-type
La procédure guix-shepherd-service définit comment le service du
Shepherd est étendu. En fait, elle renvoie un objet
<shepherd-service>
qui définit comment guix-daemon
est
démarré et stoppé (voir Services Shepherd).
account-service-type
Cette extension pour ce service est calculée par guix-accounts, qui
renvoie une liste d’objets user-group
et user-account
représentant les comptes des utilisateurs de construction (voir Invoquer guix-daemon
).
activation-service-type
Ici, guix-activation est une procédure qui renvoie une gexp, qui est un bout de code qui s’exécute au moment de l’activation — p. ex. lorsque le service est démarré.
Un service de ce type est instancié de cette manière :
(service guix-service-type
(guix-configuration
(build-accounts 5)
(extra-options '("--gc-keep-derivations"))))
Le deuxième argument de la forme service
est une valeur représentant
les paramètres de cet instance spécifique du service.
Voir guix-configuration
, pour plus
d’informations sur le type de données guix-configuration
. Lorsque la
valeur est omise, la valeur par défaut spécifiée par
guix-service-type
est utilisée :
guix-service-type est très simple car il étend d’autres services mais ne peut pas être étendu.
Le type de service pour un service extensible ressemble à ceci :
(define udev-service-type
(service-type (name 'udev)
(extensions
(list (service-extension shepherd-root-service-type
udev-shepherd-service)))
(compose concatenate) ; concatène la liste des règles
(extend (lambda (config rules)
(match config
(($ <udev-configuration> udev initial-rules)
(udev-configuration
(udev udev) ; le paquet udev à utiliser
(rules (append initial-rules rules)))))))))
C’est le type de service pour le le démon de gestion des périphériques eudev. Comparé à l’exemple précédent, en plus d’une extension de shepherd-root-service-type, on trouve deux nouveaux champs :
compose
C’est la procédure pour composer la liste des extensions de services de ce type.
Les services peuvent étendre le service udev en lui passant des listes de règles ; on compose ces extensions simplement en les concaténant.
extend
Cette procédure définie comme la valeur du service est étendue avec la composition des extensions.
Les extensions Udev sont composés en une liste de règles, mais la valeur du
service udev est elle-même un enregistrement <udev-configuration>
.
Donc ici, nous étendons cet enregistrement en ajoutant la liste des règle
contribuées à la liste des règles qu’il contient déjà.
description
C’est une chaîne donnant un aperçu du type de service. Elle peut contenir
du balisage Texinfo (voir Overview dans GNU Texinfo). La commande
guix system search
permet de rechercher dans ces chaînes et de les
afficher (voir Invoquer guix system
).
Il ne peut y avoir qu’une instance d’un type de service extensible comme
udev-service-type. S’il y en avait plus, les spécification
service-extension
seraient ambiguës.
Toujours ici ? La section suivante fournit une référence de l’interface de programmation des services.
Suivant: Référence de service, Précédent: Composition de services, Monter: Définir des services [Table des matières][Index]