Service Management dans Systemd

Couvre les workflows systemctl de démarrage, d'activation, de surveillance et de personnalisation des services systemd.

Les services d'un système Oracle Linux sont gérés par la commande systemctl subcommand.

Les sous-commandes enable, disable, stop, start, restart, reload et status sont des exemples.

Pour plus d'informations, consultez la page de manuel systemctl(1).

Démarrage et arrêt des services

Affiche les commandes de base systemctl start et systemctl stop et explique comment les changements d'état persistent.

Pour démarrer un service, utilisez la commande systemctl start :

sudo systemctl start sshd

Pour arrêter un service, utilisez la commande systemctl stop :

sudo systemctl stop sshd

La modification de l'état d'un service ne dure que lorsque le système conserve le même état.

Si vous arrêtez un service, puis que vous remplacez la cible d'état du système par une cible dans laquelle le service est configuré pour s'exécuter (par exemple, en réinitialisant le système), le service redémarre. De même, le démarrage d'un service ne permet pas au service de démarrer après un redémarrage. Reportez-vous à Activation et désactivation des services.

Activation et désactivation des services

Explique comment activer, désactiver, masquer et démasquer les services afin qu'ils démarrent (ou restent arrêtés) après les réinitialisations.

Vous pouvez utiliser la commande systemctl pour activer ou désactiver le démarrage d'un service lors de l'initialisation du système, par exemple :

sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

La commande enable active un service en créant un lien symbolique pour la cible d'état système de niveau le plus bas sur laquelle le service démarre. Dans l'exemple précédent, la commande crée le lien symbolique httpd.service pour la cible multi-user.

Remarque

Pour démarrer le service en même temps que vous l'activez, ajoutez l'option --now à la commande. Par exemple : sudo systemctl enable --now httpd

La désactivation d'un service supprime le lien symbolique :

sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

Pour vérifier si un service est activé, utilisez la sous-commande is-enabled comme indiqué dans les exemples suivants :

systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled

Après l'exécution de la commande systemctl disable, le service peut toujours être démarré ou arrêté par des comptes utilisateur, des scripts et d'autres processus.

Toutefois, si vous devez vous assurer que le service ne peut pas être démarré par inadvertance, par exemple par un service en conflit, utilisez la commande systemctl mask comme suit :

sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'

La commande mask définit la référence de service sur /dev/null. Si vous essayez de démarrer un service qui a été masqué, vous recevrez une erreur comme indiqué dans l'exemple suivant :

sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.

Pour rétablir le lien entre la référence de service et le fichier de configuration de l'unité de service correspondante, utilisez la commande systemctl unmask :

sudo systemctl unmask httpd

Pour plus d'informations, consultez la page de manuel systemctl(1).

Affichage de l'état des services

Détails des commandes systemctl is-active et status pour la vérification de l'état du service et des groupes de contrôle.

Pour vérifier si un service est en cours d'exécution, utilisez la sous-commande is-active. La sortie est active ou inactive, comme indiqué dans les exemples suivants :

systemctl is-active httpd
active
systemctl is-active sshd
inactive

La sous-commande status fournit un récapitulatif détaillé de l'état d'un service, y compris une arborescence qui affiche les tâches du groupe de contrôle (CGroup) implémentées par le service :

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...
     Docs: man:httpd.service(8)
 Main PID: 11832 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 26213)
   Memory: 32.5M
   CGroup: /system.slice/httpd.service
           ├─11832 /usr/sbin/httpd -DFOREGROUND
           ├─11833 /usr/sbin/httpd -DFOREGROUND
           ├─11834 /usr/sbin/httpd -DFOREGROUND
           ├─11835 /usr/sbin/httpd -DFOREGROUND
           └─11836 /usr/sbin/httpd -DFOREGROUND

Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.

Un élément cgroup est un ensemble de processus liés entre eux afin que vous puissiez contrôler leur accès aux ressources système. Dans cet exemple, cgroup pour le service httpd est httpd.service, qui se trouve dans la tranche system.

Les tranches divisent le fichier cgroups d'un système en différentes catégories. Pour afficher la tranche et la hiérarchie cgroup, utilisez la commande systemd-cgls :

systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─user@1000.service
│   │ └─init.scope
│   │   ├─6488 /usr/lib/systemd/systemd --user
│   │   └─6492 (sd-pam)
│   └─session-7.scope
│     ├─6484 sshd: root [priv]
│     ├─6498 sshd: root@pts/0
│     ├─6499 -bash
│     ├─6524 sudo systemd-cgls
│     ├─6526 systemd-cgls
│     └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
  ├─rngd.service
  │ └─1266 /sbin/rngd -f --fill-watermark=0
  ├─irqbalance.service
  │ └─1247 /usr/sbin/irqbalance --foreground
  ├─libstoragemgmt.service
  │ └─1201 /usr/bin/lsmd -d
  ├─systemd-udevd.service
  │ └─1060 /usr/lib/systemd/systemd-udevd
  ├─polkit.service
  │ └─1241 /usr/lib/polkit-1/polkitd --no-debug
  ├─chronyd.service
  │ └─1249 /usr/sbin/chronyd
  ├─auditd.service
  │ ├─1152 /sbin/auditd
  │ └─1154 /usr/sbin/sedispatch
  ├─tuned.service
  │ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
  ├─systemd-journald.service
  │ └─1027 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1812 /usr/sbin/atd -f
  ├─sshd.service
  │ └─1781 /usr/sbin/sshd

system.slice contient des services et d'autres processus système. user.slice contient des processus utilisateur, qui s'exécutent dans des groupes cgroups transitoires appelés portées.

Dans cet exemple, les processus de l'utilisateur portant l'ID 1000 sont exécutés dans la portée session-7.scope sous la tranche /user.slice/user-1000.slice.

Vous pouvez utiliser la commande systemctl pour limiter la CPU, les E/S, la mémoire et les autres ressources disponibles pour les processus dans les groupes de services et d'étendue. Reportez-vous à Contrôle de l'accès aux ressources système.

Pour plus d'informations, reportez-vous aux pages de manuel systemctl(1) et systemd-cgls(1). Reportez-vous également à Utilisation de Systemd pour gérer les groupes de contrôle.

Contrôle de l'accès aux ressources système

Indique comment utiliser systemctl set-property et systemd-run pour affecter des limites de CPU et de mémoire aux services et aux étendues.

Utilisez la commande systemctl pour contrôler l'accès d'un cgroup aux ressources système, par exemple :

sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G

CPUShare contrôle l'accès aux ressources de CPU. La valeur par défaut étant 1024, une valeur de 512 réduit de moitié l'accès au temps CPU dont disposent les processus dans cgroup. De même, MemoryLimit contrôle la quantité maximale de mémoire que cgroup peut utiliser.

Remarque

Vous n'avez pas besoin d'indiquer l'extension .service au nom d'un service.

Si vous spécifiez l'option --runtime, le paramètre ne persiste pas après la réinitialisation du système.

Vous pouvez également modifier les paramètres de ressource d'un service sous l'en-tête [Service] dans le fichier de configuration du service dans /usr/lib/systemd/system. Après avoir modifié le fichier, chargez de nouveau systemd ses fichiers de configuration, puis redémarrez le service :

sudo systemctl daemon-reload
sudo systemctl restart service

Vous pouvez exécuter des commandes générales dans les étendues et utiliser systemctl pour contrôler l'accès que ces cgroups transitoires ont aux ressources système. Pour exécuter une commande dans une étendue, utilisez la commande systemd-run :

sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]

Si vous ne voulez pas créer le groupe sous la tranche system par défaut, vous pouvez indiquer une autre tranche ou le nom d'une nouvelle tranche. L'exemple suivant exécute une commande nommée mymonitor dans mymon.scope sous myslice.slice :

sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
Remarque

Si vous n'indiquez pas l'option --scope, le groupe de contrôle est créé en tant que service plutôt qu'en tant que portée.

Vous pouvez ensuite utiliser systemctl pour contrôler l'accès dont dispose une étendue aux ressources système de la même manière que pour un service. Cependant, contrairement à un service, vous devez indiquer l'extension .scope, par exemple :

sudo systemctl --runtime set-property mymon.scope CPUShares=256

Pour plus d'informations, reportez-vous à Utilisation de Systemd pour gérer les groupes de contrôle et aux pages de manuel systemctl(1), systemd-cgls(1) et systemd.resource-control(5).

Créer un service systemd basé sur l'utilisateur

Outre les fichiers systemd à l'échelle du système, systemd vous permet de créer des services basés sur l'utilisateur que vous pouvez exécuter à partir d'un niveau utilisateur sans nécessiter d'accès root et de privilèges. Ces services basés sur l'utilisateur sont sous le contrôle de l'utilisateur et sont configurables indépendamment des services système.

Voici quelques caractéristiques distinctives des services systemd basés sur l'utilisateur :

  • Les services systemd basés sur l'utilisateur sont liés à un compte utilisateur spécifique.
  • Elles sont créées dans le répertoire de base de l'utilisateur associé dans $HOME/.config/systemd/user/.
  • Une fois ces services activés, ils démarrent lorsque l'utilisateur associé se connecte. Ce comportement diffère de celui des services systemd activés qui démarrent au démarrage du système.

Cette fonctionnalité est particulièrement utile lors de la création de services de conteneur Podman. Pour plus d'informations sur Podman, reportez-vous au Guide de l'utilisateur Oracle Linux : Podman.

Pour créer un service basé sur un utilisateur, procédez comme suit :

  1. Créez le fichier d'unité du service dans le répertoire $HOME/.config/systemd/user, par exemple :
    touch $HOME/.config/systemd/user/myservice.service
  2. Ouvrez le fichier d'unités et indiquez les valeurs des options à utiliser, telles que Description, ExecStart, WantedBy, etc.
    Pour référence, reportez-vous à Options configurables dans les fichiers d'unité de service et aux pages de manuel systemd.service(5) et systemd.unit(5).
  3. Activez le démarrage automatique du service lorsque vous ouvrez une session.
    systemctl --user enable myservice.service
    Remarque

    Lors de la déconnexion, le service est arrêté, sauf si l'utilisateur root a activé l'exécution de processus pour l'utilisateur.

    Pour plus d'informations, reportez-vous à https://docs.oracle.com/en/learn/ol-systemd/.

  4. Démarrez le service.
    systemctl --user start myservice.service
  5. Vérifiez que le service est en cours d'exécution
    systemctl --user status myservice.service

Modification des fichiers d'unité de service systemd

Explique comment remplacer les fichiers d'unités packagées et créer des fragments de code déposés sous /etc/systemd/system.

Pour modifier la configuration des services systemd, copiez les fichiers avec les extensions .service, .target, .mount et .socket de /usr/lib/systemd/system vers /etc/systemd/system.

Après avoir copié les fichiers, vous pouvez modifier les versions dans /etc/systemd/system.

Les fichiers dans /etc/systemd/system sont prioritaires sur les versions dans /usr/lib/systemd/system. Les fichiers dans /etc/systemd/system ne sont pas écrasés lorsque vous mettez à jour un package qui touche des fichiers dans /usr/lib/systemd/system.

Pour rétablir la configuration systemd par défaut pour un service particulier, vous pouvez renommer ou supprimer les copies dans /etc/systemd/system.

Une autre approche pour modifier la configuration d'un service consiste à créer un fichier de dépôt. Avec cette approche, vous pouvez conserver l'unité d'origine tout en modifiant des paramètres spécifiques de l'unité.

Créez des fichiers de dépôt dans /etc/systemd/system/unit_name.d/, où le répertoire unit_name.d est une unité existante, puis donnez-leur une extension de fichier .conf.

Par exemple : /etc/systemd/system/unit_name.d/name_of_drop-in.conf. systemd lit le fichier .conf et applique les paramètres à l'unité d'origine.

Les sections suivantes décrivent les différentes parties d'un fichier d'unité de service que vous pouvez modifier et personnaliser pour un système.

A propos des fichiers d'unité de service

Les services sont exécutés en fonction des fichiers d'unité de service correspondants. Un fichier d'unité de service contient généralement les sections suivantes, chaque section ayant ses options définies respectives qui déterminent le mode d'exécution d'un service spécifique :

[Unit]

Contient des informations sur le service.

[UnitType]:

Contient des options spécifiques au type d'unité du fichier. Par exemple, dans un fichier d'unité de service, cette section est intitulée [Service] et contient des options spécifiques aux unités du type de service, telles que ExecStart ou StandardOutput.

Seuls les types d'unités qui offrent des options spécifiques à leur type ont une telle section.

[Install]

Contient des informations d'installation pour l'unité spécifique. Les informations de cette section sont utilisées par les commandes systemctl enable et systemctl disable.

Un fichier d'unité de service peut contenir les configurations suivantes pour un service.

[Unit]
Description=A test service used to develop a service unit file template

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh

[Install]
WantedBy=default.target

Options configurables dans les fichiers d'unité de service décrit certaines options configurées couramment utilisées disponibles sous chaque section. Une liste complète est également disponible dans les pages de manuel systemd.service(5) et systemd.unit(5).

Options configurables dans les fichiers d'unité de service

Chacune des listes suivantes traite d'une section distincte du fichier d'unité de service.

Description des options sous la section [Unité]

La liste suivante fournit un aperçu général des options configurables couramment utilisées disponibles dans la section [Unit] du fichier d'unité de service :

Description

Fournit des informations sur le service. Les informations sont affichées lorsque vous exécutez la commande systemctl status sur l'unité.

Documentation

Contient une liste d'URI séparés par des espaces faisant référence à la documentation pour cette unité ou sa configuration.

After

Configure l'unité pour qu'elle s'exécute uniquement après le démarrage des unités répertoriées dans l'option.

Dans l'exemple suivant, si le fichier var3.service contient l'entrée suivante, il n'est démarré qu'après le démarrage des unités var1.service et var2.service :

 After=var1.service var2.service
Requires

Configure une unité pour qu'elle ait des dépendances de besoins sur d'autres unités. Si une unité est activée, les unités répertoriées dans son option Requires sont également activées.

Wants

Version moins stricte de l'option Requires. Par exemple, une unité spécifique peut être activée même si l'une des unités répertoriées dans son option Wants ne démarre pas.

Description des options sous la section [Service]

La liste suivante donne un aperçu général des options configurables couramment utilisées disponibles dans la section [Service] d'un fichier d'unité de service.

Type

Configure le type de démarrage du processus pour l'unité de service.

Par défaut, la valeur de ce paramètre est simple, ce qui indique que le processus principal du service est celui qui est démarré par le paramètre ExecStart.

En général, si le type d'un service est simple, la définition peut être omise dans le fichier.

StandardOutput
Configure la manière dont les événements du service sont journalisés. Par exemple, supposons qu'un fichier d'unité de service comporte l'entrée suivante :
StandardOutput=journal

Dans l'exemple, la valeur journal indique que les événements sont enregistrés dans le journal, qui peut être affiché à l'aide de la commande journalctl.

ExecStart

Spécifie le chemin complet et la commande qui démarre le service, par exemple, /usr/bin/npm start.

ExecStop

Spécifie les commandes à exécuter pour arrêter le service démarré via ExecStart.

ExecReload

Spécifie les commandes à exécuter pour déclencher un rechargement de configuration dans le service.

Restart

Configure si le service doit être redémarré lorsque le processus de service se ferme, est arrêté ou lorsqu'un délai d'expiration est atteint.

Remarque

Cette option ne s'applique pas lorsque le processus est arrêté correctement par une opération systemd, par exemple systemctl stop ou systemctl restart. Dans ce cas, le service n'est pas redémarré par cette option de configuration.
RemainAfterExit

Valeur booléenne qui configure si le service doit être considéré comme actif même lorsque tous ses processus ont pris fin. La valeur par défaut est no.

Description des options sous la section [Installer]

La liste suivante donne un aperçu général des options configurables couramment utilisées disponibles dans la section [Install] du fichier d'unité de service.

Alias

Liste de noms d'unité séparés par des espaces.

Au moment de l'installation, systemctl enable crée des liens symboliques de ces noms vers le nom de fichier de l'unité.

Les alias ne sont effectifs que lorsque l'unité est activée.

RequiredBy

Configure le service qui doit être requis par d'autres unités.

Par exemple, considérons un fichier d'unité var1.service auquel la configuration suivante est ajoutée :

RequiredBy=var2.service var3.service

Lorsque var1.service est activé, une dépendance Requires est accordée à var2.service et var3.service sur var1.service. Cette dépendance est définie par un lien symbolique créé dans le dossier .requires de chaque service dépendant (var2.service et var3.service) qui pointe vers le fichier d'unité système var1.service.

WantedBy

Spécifie la liste des unités auxquelles une dépendance wants doit être accordée au service dont vous modifiez le fichier.

Par exemple, considérons un fichier d'unité var1.service auquel la configuration suivante est ajoutée :

WantedBy=var2.service var3.service

Lorsque var1.service est activé, une dépendance Wants est accordée à var2.service et à var3.service sur var1.service. Cette dépendance est définie par un lien symbolique créé dans le dossier ".wants" de chaque service dépendant (var2.service et var3.service) qui pointe vers le fichier d'unité système pour var1.service.

Also

Répertorie les unités supplémentaires à installer ou à supprimer lorsque l'unité est installée ou supprimée.

DefaultInstance

L'option DefaultInstance s'applique uniquement aux fichiers d'unités de modèle.

Les fichiers d'unités de modèle permettent de créer plusieurs unités à partir d'un seul fichier de configuration. L'option DefaultInstance indique l'instance pour laquelle l'unité est activée si le modèle est activé sans instance définie explicitement.

Créer un fichier de dépôt d'unité

Vous pouvez utiliser la commande systemctl edit pour générer automatiquement un fichier d'unité ou un fichier d'unité systemd pour toute unité systemd existante. Vous pouvez utiliser le fichier de dépôt pour remplacer la configuration de base d'une unité ou pour étendre les conditions requises pour un fichier d'unité.

  1. Exécutez la commande systemctl edit <unit> pour générer automatiquement un fichier de dépôt systemd et ouvrir le fichier dans l'éditeur par défaut du système.

    Par exemple, pour modifier l'unité cockpit.socket afin de modifier le port sur lequel la console Web Cockpit écoute, vous pouvez effectuer les opérations suivantes :

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    L'option --drop-in vous permet d'indiquer le nom de fichier utilisé pour le fichier de dépôt. Si vous ne spécifiez pas cette option, le nom de fichier par défaut est défini sur override.conf.

    L'éditeur de texte système s'ouvre et vous pouvez ajouter des lignes pour remplacer la configuration par défaut :

    [Socket]
    ListenStream=
    ListenStream=443
    Remarque

    Une configuration supplémentaire en dehors de systemd est requise si vous modifiez le port de processus d'écoute par défaut pour Cockpit. Par exemple, vous devrez peut-être modifier les contextes SELinux et la configuration du pare-feu.
  2. Enregistrez le fichier de dépôt ou quittez.
    Si vous enregistrez les modifications apportées au fichier de dépôt, le fichier est automatiquement installé dans /etc/systemd/system/<unit>.d/<drop-in.file>. Si vous quittez l'éditeur sans enregistrer les modifications, le fichier n'est pas créé et aucune autre mise à jour n'est requise.
  3. Rechargez la configuration du démon systemd.
    sudo systemctl daemon-reload
  4. Redémarrez l'unité systemd que vous avez mise à jour.

    Par exemple, pour redémarrer le fichier cockpit.socket utilisé dans cet exemple, exécutez :

    sudo systemctl restart cockpit.socket