PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

blog-libre : systemctl –user

dimanche 15 septembre 2019 à 08:00

La littérature concernant systemctl est assez abondante en revanche pour systemctl --user on frôle le désert, un petit article ?

J’avais le désir de lancer mon émulateur de terminal Tilix au démarrage de ma session et qu’il se relance à chaque fois qu’il est fermé. Je commence à bien toucher les services systemd, systemctl mais là je me suis pris un four.

Le tiercé dans le bon ordre

Comme d’habitude ce n’est pas forcément compliqué, c’est juste qu’il faut le savoir. Pour mettre en place un service utilisateur systemd la difficulté ne se situe pas dans les lignes de commande mais davantage dans le bon ordre/enchaînement des commandes.

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/tilix.service
systemctl --user enable tilix.service # systemctl --user reenable tilix.service
systemctl --user start tilix.service # journalctl --user -u tilix -f

nano ~/.config/systemd/user/tilix.service
systemctl --user daemon-reload; systemctl --user restart tilix # systemctl --user --now enable tilix

Remarquez que nulle part il n’y a de sudo, vous n’avez besoin d’aucun droit root justement parce qu’on met en place un service utilisateur. Un service plus « classique » systemd comme on en met sur les serveurs par exemple aurait donné sudo systemctl enable joli.service.

On commence par créer le dossier qui va accueillir nos services utilisateur mkdir -p ~/.config/systemd/user. On crée/configure notre service nano ~/.config/systemd/user/tilix.service puis on l’active systemctl --user enable tilix.service donc à la prochaine ouverture de session de notre utilisateur, il sera lancé automatiquement. Maintenant on le démarre systemctl --user start tilix.service notamment pour voir si il fonctionne comme on le souhaite. En plus de ces commandes, il vous faudra utiliser journalctl --user -u tilix -f pour consulter les messages de votre service dans le journal et systemctl --user status tilix.service pour connaître l’état de votre service. À retenir aussi la commande systemctl --user reenable tilix.service qui va supprimer les symlinks créés par systemd pour démarrer le service et les recréer (This is a combination of disable and enable and is useful to reset the symlinks a unit file is enabled with to the defaults configured in its « [Install] » section), utile quand on se trompe dans la section [Install] (multi-user.target => default.target par exemple comme nous allons le voir après).

On part du principe que le service ne correspond pas exactement à ce que l’on souhaite (ça arrive souvent), on rentre donc dans une seconde phase, la modification du service et les commandes pour la prendre en compte. On modifie notre service car un truc nous convient pas nano ~/.config/systemd/user/tilix.service. On informe systemd que le service a été modifié et on redémarre le service systemctl --user daemon-reload; systemctl --user restart tilix. À connaître également on active le service à l’ouverture de la session et on le démarre systemctl --user --now enable tilix qui est l’équivalent de deux commandes --user enable et --user start.

tilix.service

La première version de mon service fut celle-ci, cat ~/.config/systemd/user/tilix.service.

[Unit]
Description=Tilix

[Service]
Type=simple
ExecStart=/usr/bin/tilix --minimize
Restart=always

[Install]
WantedBy=multi-user.target

Du très classique sur lequel je vais peu revenir, voir la documentation. Le Restart=always qui relance automatiquement Tilix dès qu’il est fermé, la commande à lancer ExecStart=/usr/bin/tilix --minimize. Dans mon cas je ne veux pas que Tilix ait le focus (soit au premier plan), je le veux minimisé.

La seconde version définitive.

[Unit]
Description=Tilix

[Service]
Type=simple
ExecStart=/usr/bin/tilix --minimize
KillMode=none
Restart=always

[Install]
WantedBy=default.target

J’ai remarqué rapidement que lorsque je fermais Tilix, toutes les applications que j’avais lancé via le terminal (par exemple Firefox ou TeamViewer) étaient fermées immédiatement. Voir KillMode. Autre subtilité/difficulté d’un service utilisateur, les targets ne sont pas les mêmes qu’un service systemd classique. Dans ce dernier vous verrez souvent WantedBy=multi-user.target alors que dans un service utilisateur, il n’y a pas multi-user.target notamment. Comparez systemctl list-units --type target et systemctl --user list-units --type target.

Euh… mais ça marche pas ?

Soudain le drame, Tilix n’est pas lancé à l’ouverture de la session après un redémarrage du pc. J’ai creusé, retourné, testé pensant que mon service Tilix n’était pas bon. L’un des côtés négatifs de mon syndrome de l’imposteur est que je vais passer X heures à chercher mon erreur sans envisager que ça ne vient pas de moi.

Après plusieurs heures de tests et de recherches vaines, j’allais raccrocher, la défaite était lourde. Je me suis souvenu qu’au boulot j’avais ramé deux heures sur un truc qui ne fonctionnait pas, c’était « juste » le script fourni qui était merdique. J’ai fait une recherche et en deux minutes j’ai trouvé le bug… Assez ironiquement il est reporté chez Red Hat depuis 15 jours, chez Ubuntu ça date. Il s’agit d’un bug lié à ECryptFS (partition /home chiffrée), j’ai testé la solution proposée avec /etc/pam.d/common-session mais ça ne fonctionne pas chez moi. J’ai confirmé le bug avec la session de Madame (partition /home non chiffrée), le service Tilix se lance bien à l’ouverture de session.

And voilà. Finalement j’ai ajouté dans l’utilitaire Session et démarrage de XFCE, Démarrage automatique d’application : systemctl --user --now enable tilix en attendant que le bug soit résolu.

Sources :
https://wiki.archlinux.fr/Systemd/utilisateur
https://vic.demuzere.be/articles/using-systemd-user-units/
https://unix.stackexchange.com/questions/385964/launching-chromium-on-startup-with-systemd

Gravatar de blog-libre
Original post of blog-libre.Votez pour ce billet sur Planet Libre.