Как правильно написать правило udev, чтобы остановить службу под systemd?

12

Я использую Arch Linux, и у меня есть правило udev, которое запускает службу при вставке устройства. В этом случае он устанавливает соединение при подключении модема 3G.

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

Однако, если устройство будет удалено, systemd не остановит службу, и, следовательно, при повторном подключении она не запустит службу, поскольку она уже запущена.

Мне нужно соответствующее правило udev, которое запускается при удалении устройства, чтобы остановить службу.

Обновить

Используя ответ ниже, теперь у меня есть следующее правило udev

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.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

Я использую netcfg-wvdialот AUR, чтобы сделать набор номера.

crazystick
источник

Ответы:

11

Ваша проблема может быть решена только с помощью systemd, просто указав, что ваш сервис требует или, что еще лучше, привязывается к данному устройству.

Цитирование:

«Если один из других [обязательных / связанных с] подразделений будет деактивирован или его активация завершится неудачно, этот блок [сервис] будет деактивирован»

Вам просто нужно отредактировать служебный файл, как показано ниже.

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

Примечание: чтобы получить список всех доступных файлов устройства, используйте systemctl list-units --all --full | grep ".device"

brunocodutra
источник
Значит ли это, что мне не нужно правило udev? Я попытался сделать, как вы предложили, создав новый файл службы для замены netcfg @ wvdial.service и включив эти две строки. Похоже, что сейчас он останавливает службу, но не запускает ее, когда устройство снова подключается.
сумасшедший
@crazystick вам все еще нужно правило udev для запуска сервиса, я имел в виду, что вам не нужно использовать udev, чтобы остановить его.
brunocodutra
Понял. Прекрасно работает как с правилом udev, так и с измененным служебным файлом.
сумасшедший
2
Вы можете использовать StopWhenUnneeded=trueвместо этого BindsToиAfter
SergA
@SergA к тому времени, когда я ответил на это, была ошибка, препятствующая StopWhenUnneeded=trueработе, но я думаю, что она уже давно исправлена.
brunocodutra