Який правильний спосіб написати правило 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-wvdialAUR для набору номера.

Відповіді:


11

Вашу проблему можна вирішити лише за допомогою системи systemd, просто вказавши, що ваша послуга вимагає або, ще краще, BindsДля даного пристрою.

Цитування:

"Якщо один з інших [обов'язкових / прив'язаних до] блоків деактивується або його активація не вдається, цей пристрій [послуга] буде відключений"

Вам просто потрібно відредагувати сервісний файл, як описано нижче.

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

Примітка: щоб отримати список усіх доступних файлів пристрою пристрою systemctl list-units --all --full | grep ".device"


Чи означає це, що мені не потрібно правила udev? Я спробував зробити так, як ви запропонували, створивши новий сервісний файл для заміни netcfg @ wvdial.service і включаючи ці два рядки. Здається, це припиняє послугу зараз, але він не запускається, коли пристрій підключається знову.
crazystick

@crazystick вам все-таки потрібне правило udev для запуску послуги, що я мав на увазі, що вам не потрібно буде використовувати udev, щоб зупинити його.
brunocodutra

Зрозумів. Дуже добре працює як з правилом udev, так і з модифікованим сервісним файлом.
crazystick

2
Ви можете використовувати StopWhenUnneeded=trueнатомість BindsToіAfter
SergA

@SergA на той момент, коли я відповів на це, виникла помилка, яка заважає StopWhenUnneeded=trueпрацювати, але я вважаю, що це виправлено вже досить довго.
brunocodutra
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.