30. Systemd utilisateur

Ceci n’est pas un article sur systemd, mais la présentation d’une utilisation très pratique de systemd par un utilisateur pour lancer une commande avec systemd au lancement de la session de l’utilisateur. L’article sur lequel je me suis basé pour réaliser ce que je voulais est : https://medium.com/@alexeypetrenko/systemd-user-level-persistence-25eb562d2ea8

Mon problème était le suivant : je dispose d’un clavier bluetooth récupéré d’une tablette obsolète. Or ce clavier ne dispose pas de la touche backslash (\). C’est extrêmement désagréable pour quelqu’un qui pratique intensivement LaTeX.

Il s’agissait donc de lancer une modification du clavier à chaque lancement de session. Pour cela il fallait d’abord savoir comment affecter la touche backslash à l’une des touches libre de mon clavier. Après quelques recherches, le logiciel permettant cette modification a été trouvé et la commande suivante testée fonctionnelle :

xmodmap -e 'keycode 202=backslash' & 

Xmodmap permet d’affecter une touche physique, ici la touche 202, à un caractère, ici backslash. Pour déterminer le code de la touche, la commande suivante est nécessaire :

xev -event keyboard

Une fois lancée, en pressant sur une touche, on obtient un retours comme :

KeyPress event, serial 25, synthetic NO, window 0x3a00001,
    root 0x389, subw 0x0, time 5876177, (922,180), root:(924,260),
    state 0x0, keycode 202 (keysym 0x5c, backslash), same_screen YES,
    XLookupString gives 1 bytes: (5c) "\"
    XmbLookupString gives 1 bytes: (5c) "\"
    XFilterEvent returns: False

dans lequel figure « keycode 202 » (ici déjà affectée à backslash). L’esperluette (&) de la fin de commande permettait de lancer la commande pour une session, ce que systemd va nous permettre de faire automatiquement et cela sans aucun droits de superutilisateur.

Venons en donc à systemd. À l’instar des services lancés par systemd pour root, l’idée est de mettre dans le répertoire (à créer au besoin) :

.config/systemd/user/

un fichier de service à lancer au démarrage de la session. Dans mon cas, le nom de ce fichier sera évidemment « backslash.service » puisque ce service va me permettre de disposer de la touche backslash. Son contenu sera le suivant :

[Unit]
Description=Just for backslash character

[Service]
ExecStart= /usr/bin/xmodmap -e 'keycode 202=backslash'
Restart=always
RestartSec=60

[Install]
WantedBy=default.target

Les lignes de restart signifient qu’en cas de problème le démon est relancé au bout de 60 secondes.

Pour installer le service, il faut alors utiliser la commande :

systemctl --user enable backslash.service

Un certains nombre de liens seront créé pour que systemd puisse lancer le service au démarrage de la session.

Pour démarrer le démon sans relancer la session, il faut classiquement faire :

systemctl --user start backslash.service

Si cela ne fonctionne pas, comme ce fut le cas pour moi, lancez :

systemctl --user status backslash.service

L’état du service vous sera retourné et vous verrez apparaître un « Failure » si la commande de votre service est mauvaise. En l’occurrence, pour moi, ce fut le fait qu’il fallait mettre le chemin complet vers xmodmap, soit /user/bin/xmodmap.

Enfin, après avoir corrigé les problèmes, un :

systemctl --user restart backslash.service

ne suffit pas. Il faut encore recharger l’ensemble des démons de l’utilisateur par :

systemctl --user daemon-reload
Voilà. Systemd peut donc être très utile au niveau utilisateur pour remettre en place des fonds d'écran par exemple ou tout autre commande à lancer au démarrage de la session utilisateur.

Laisser un commentaire