Quelle est la bonne façon d'écrire une règle udev pour arrêter un service sous systemd


12

J'utilise Arch Linux et j'ai une règle udev qui démarre un service lorsqu'un périphérique est inséré. Dans ce cas, il établit une connexion lorsqu'un modem 3G est branché.

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

Cependant, si le périphérique est supprimé, systemd n'arrêtera pas le service, et donc quand il sera rebranché, il ne démarrera pas le service, car il est déjà en cours d'exécution.

Ce dont j'ai besoin, c'est d'une règle udev correspondante qui s'exécute lorsque le périphérique est supprimé pour arrêter le service.

Mise à jour

En utilisant la réponse ci-dessous, ce que j'ai maintenant est la règle udev suivante

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"

avec le fichier de service suivant (qui a été essentiellement copié et collé à partir du fichier de service netcfg:

[Unit]
Description=Netcfg networking service for Vodafone Dongle
Before=network.target
Wants=network.target
BindsTo=dev-gsmmodem.device
After=dev-gsmmodem.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/netcfg check-iface wvdial
ExecStop=-/usr/bin/netcfg down wvdial
KillMode=none

[Install]
WantedBy=multi-user.target

J'utilise netcfg-wvdialde l'AUR pour faire la numérotation.

Réponses:


11

Votre problème peut être résolu en utilisant systemd uniquement, en spécifiant simplement que votre service nécessite ou, mieux encore, BindsTo à l'appareil donné.

Citant:

"Si l'une des autres unités [requises / liées à] est désactivée ou que son activation échoue, cette unité [service] sera désactivée"

Il vous suffit de modifier votre fichier de service comme suit.

[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

Remarque: pour obtenir une liste de tous les fichiers d'unité de périphérique disponibles, utilisez systemctl list-units --all --full | grep ".device"


Est-ce à dire que je n'ai pas besoin de la règle udev? J'ai essayé de faire comme vous l'avez suggéré, en créant un nouveau fichier de service pour remplacer netcfg @ wvdial.service et en incluant ces deux lignes. Il semble arrêter le service maintenant, mais il ne le démarre pas lorsque l'appareil est à nouveau branché.
crazystick

@crazystick vous avez toujours besoin de la règle udev pour démarrer le service, ce que je voulais dire, c'est que vous n'aurez pas besoin d'utiliser udev pour l'arrêter.
brunocodutra

Je l'ai. Fonctionne très bien avec la règle udev et le fichier de service modifié.
crazystick

2
Vous pouvez utiliser à la StopWhenUnneeded=trueplace BindsToetAfter
SergA

@SergA au moment où j'ai répondu, il y avait un bug qui empêchait StopWhenUnneeded=truede fonctionner, mais je pense qu'il a été corrigé depuis un bon moment maintenant.
brunocodutra
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.