Jaki jest prawidłowy sposób napisania reguły udev, aby zatrzymać usługę w systemie systemd

12

Korzystam z Arch Linux i mam regułę udev, która uruchamia usługę po włożeniu urządzenia. W takim przypadku wybiera połączenie, gdy modem 3G jest podłączony.

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

Jeśli jednak urządzenie zostanie usunięte, systemd nie zatrzyma usługi, a zatem po ponownym podłączeniu nie uruchomi usługi, ponieważ jest już uruchomiona.

Potrzebuję pasującej reguły udev, która działa, gdy urządzenie jest usuwane, aby zatrzymać usługę.

Aktualizacja

Korzystając z poniższej odpowiedzi, teraz mam następującą zasadę udev

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

z następującym plikiem usługi (który został w zasadzie skopiowany i wklejony z pliku usługi 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

Używam netcfg-wvdialz AUR do wybierania numeru.

szalony
źródło

Odpowiedzi:

11

Twój problem można rozwiązać za pomocą systemd, po prostu określając, że twoja usługa wymaga lub, jeszcze lepiej, BindsTo do danego urządzenia.

Cytowanie:

„Jeśli jedna z pozostałych [wymaganych / powiązanych z] jednostek zostanie dezaktywowana lub jej aktywacja się nie powiedzie, ta jednostka [usługa] zostanie dezaktywowana”

Musisz tylko edytować plik usługi w następujący sposób.

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

Uwaga: aby uzyskać listę wszystkich dostępnych plików jednostek urządzeń, użyj systemctl list-units --all --full | grep ".device"

brunocodutra
źródło
Czy to oznacza, że ​​nie potrzebuję reguły udev? Próbowałem zrobić tak, jak zasugerowałeś, tworząc nowy plik usługi w celu zastąpienia netcfg @ wvdial.service i włączając te dwie linie. Wygląda na to, że teraz zatrzymuje usługę, ale nie uruchamia się po ponownym podłączeniu urządzenia.
crazystick,
@ crazystick nadal potrzebujesz reguły udev do uruchomienia usługi, miałem na myśli to, że nie będziesz musiał używać udev, aby ją zatrzymać.
brunocodutra,
Rozumiem. Działa bardzo dobrze zarówno z regułą udev, jak i zmodyfikowanym plikiem usługi.
crazystick,
2
Można użyć StopWhenUnneeded=truezamiast BindsToiAfter
Serga
@SergA do czasu, gdy odpowiedziałem na to pytanie, wystąpił błąd uniemożliwiający StopWhenUnneeded=truedziałanie, ale sądzę, że został naprawiony już od dłuższego czasu.
brunocodutra