Was ist der richtige Weg, um eine udev-Regel zu schreiben, um einen Dienst unter systemd zu stoppen?

12

Ich verwende Arch Linux und habe eine udev-Regel, die einen Dienst startet, wenn ein Gerät eingefügt wird. In diesem Fall wird eine Verbindung gewählt, wenn ein 3G-Modem angeschlossen ist.

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"

Wenn das Gerät jedoch entfernt wird, stoppt systemd den Dienst nicht und startet den Dienst daher nicht, wenn es erneut angeschlossen wird, da es bereits ausgeführt wird.

Was ich brauche, ist eine übereinstimmende udev-Regel, die ausgeführt wird, wenn das Gerät entfernt wird, um den Dienst zu beenden.

Aktualisieren

Mit der folgenden Antwort habe ich jetzt die folgende udev-Regel

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

mit der folgenden Servicedatei (die im Wesentlichen aus der netcfg-Servicedatei kopiert und eingefügt wurde:

[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

Ich benutze netcfg-wvdialvon der AUR, um das Wählen zu machen.

Crazystick
quelle

Antworten:

11

Ihr Problem kann möglicherweise nur mit systemd gelöst werden, indem Sie einfach Ihren Dienst angeben angeben das angegebene Gerät erfordert oder, noch besser, an das angegebene Gerät bindet .

Zitat:

"Wenn eine der anderen [erforderlichen / gebundenen] Einheiten deaktiviert wird oder ihre Aktivierung fehlschlägt, wird diese Einheit [Dienst] deaktiviert."

Sie müssen nur Ihre Servicedatei wie folgt bearbeiten.

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

Hinweis: Um eine Liste aller verfügbaren Geräteeinheiten zu erhalten, verwenden Sie systemctl list-units --all --full | grep ".device"

Brunocodutra
quelle
Bedeutet das, dass ich die udev-Regel nicht brauche? Ich habe versucht, das zu tun, was Sie vorgeschlagen haben, indem ich eine neue Servicedatei erstellt habe, um netcfg @ wvdial.service zu ersetzen, und diese beiden Zeilen eingeschlossen habe. Es scheint den Dienst jetzt zu stoppen, aber es startet ihn nicht, wenn das Gerät wieder angeschlossen wird.
Crazystick
@crazystick Sie benötigen immer noch die udev-Regel, um den Dienst zu starten. Ich meinte, Sie müssen udev nicht verwenden, um ihn zu stoppen.
Brunocodutra
Ich habs. Funktioniert sehr gut mit der udev-Regel und der geänderten Servicedatei.
Crazystick
2
Sie können StopWhenUnneeded=truestattdessen BindsToundAfter
SergA
@SergA Als ich darauf antwortete, gab es einen Fehler, der das Funktionieren verhinderte StopWhenUnneeded=true, aber ich glaube, dass er schon eine ganze Weile behoben wurde.
Brunocodutra