Désactiver un service avec systemd

Sujet simple en apparence, plus complexe en réalité. La documentation en Français chez Red Hat pour Désactiver un service.

Empêcher un service de se lancer automatiquement : systemctl disable

sudo systemctl disable bluetooth empêchera le service de se lancer au boot, cette commande lit la section [Install] de l’unité de service sélectionnée (systemctl cat bluetooth) et supprime les liens symboliques appropriés pointant vers le fichier /usr/lib/systemd/system/name.service du répertoire /etc/systemd/system/ et de ses sous-répertoires.

Personnellement j’utilise toujours sudo systemctl disable --now bluetooth, --now : When used with enable, the units will also be started. When used with disable or mask, the units will also be stopped. The start or stop operation is only carried out when the respective enable or disable operation has been successful. Cette commande désactive le service (disable) et l’arrête (--now).

Pour faire l’opération inverse sudo systemctl enable --now bluetooth va activer le service et le démarrer.

Avec systemctl disable :

  • Le service ne sera pas lancé au boot
  • On peut lancer le service manuellement (sudo systemctl start bluetooth)
  • Le service peut être lancé par un autre service
  • Suivant les distributions/packages, la mise à jour du paquet peut activer le service et le démarrer. Dans cette situation il faudrait donc désactiver le service (sudo systemctl disable) à chaque fois que le paquet est mis à jour

Désactiver un service totalement : systemctl mask

sudo systemctl mask --now wpa_supplicant remplace le fichier /etc/systemd/system/name.service par un lien symbolique pointant vers /dev/null, ce qui rend le fichier de l’unité inaccessible à systemd. À noter que sudo ln -s /dev/null /etc/systemd/system/wpa_supplicant.service fait le même travail. Tiré du man systemctl : This will link these unit files to /dev/null, making it impossible to start them. This is a stronger version of disable, since it prohibits all kinds of activation of the unit, including enablement and manual activation.

Pour faire l’opération inverse :

sudo systemctl unmask wpa_supplicant
sudo systemctl start wpa_supplicant

Avec systemctl mask, on ne peut plus « du tout » lancer le service :

  • Le service ne sera pas lancé au boot
  • On ne peut pas lancer le service manuellement (sudo systemctl start wpa_supplicant)
  • Le service ne peut pas être lancé par un autre service
  • Le service ne peut pas être activé (sudo systemctl enable wpa_supplicant)

Certains se demandent peut-être pourquoi installer un paquet si c’est pour désactiver son service totalement. Le cas le plus commun est que le paquet est une dépendance d’un autre. wpasupplicant est un bon exemple, network-manager a comme dépendance wpasupplicant (apt-cache depends network-manager). Par conséquent même si vous utilisez iwd et son service (à la place de wpasupplicant), vous ne pouvez pas désinstaller wpasupplicant (alors que vous n’utilisez plus son service).

Cas spécial

J’installe TeamViewer sur mon pc. Je ne souhaite pas que le service tourne tout le temps (lancé au boot) mais j’ai besoin de pouvoir le démarrer quand j’en ai besoin (sudo systemctl start teamviewerd). sudo systemctl disable teamviewerd répond au besoin mais quand le paquet TeamViewer est mis à jour (sudo apt upgrade), le service teamviewerd est de nouveau activé et démarré. Je devrais le désactiver à chaque fois que le paquet est mis à jour… pénible.

J’utilise un drop-in systemd (/etc/systemd/system/teamviewerd.service.d/teamviewer.conf) qui permet de surcharger la configuration du service sans toucher au fichier « principal » du service (/etc/systemd/system/teamviewerd.service) qui peut être modifié lors d’une mise à jour.

sudo systemctl disable --now teamviewerd
sudo mkdir -p /etc/systemd/system/teamviewerd.service.d
sudo nano /etc/systemd/system/teamviewerd.service.d/teamviewer.conf
[Install]
WantedBy=

sudo systemctl daemon-reload

Pour faire l’opération inverse :

sudo rm -r /etc/systemd/system/teamviewerd.service.d
sudo systemctl daemon-reload
sudo systemctl enable --now teamviewerd

Avec cette méthode :

  • Le service ne sera pas lancé au boot
  • On peut lancer le service manuellement (sudo systemctl start teamviewerd)
  • Le service peut être lancé par un autre service
  • La mise à jour du paquet va démarrer le service… mais au prochain boot le drop-in systemd va faire son job donc le service ne sera pas démarré

Adaptation

J’ai souhaité parler d’un sujet simple en le traitant en profondeur (sans en faire trop, cela a tendance à perdre le lecteur). J’avais l’article Communautés techniques, utilisateurs libérés en tête, rester accessible, fournir une info technique utile tout en répondant à la question de l’usage.

C’était comment ?

Vus : 342
Publié par blog-libre : 133