Apa cara yang benar untuk menulis aturan udev untuk menghentikan layanan di bawah systemd

12

Saya menjalankan Arch Linux, dan saya memiliki aturan udev yang memulai layanan ketika perangkat dimasukkan. Dalam hal ini, itu akan memanggil sambungan ketika modem 3G dicolokkan.

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

Namun, jika perangkat dihapus, systemd tidak akan menghentikan layanan, dan karenanya ketika dicolokkan lagi, itu tidak akan memulai layanan, karena sudah berjalan.

Yang saya butuhkan adalah aturan udev yang cocok yang berjalan ketika perangkat dihapus untuk menghentikan layanan.

Memperbarui

Menggunakan jawaban di bawah ini, apa yang sekarang saya miliki adalah aturan udev berikut

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

dengan file layanan berikut (yang pada dasarnya disalin dan ditempelkan dari file layanan 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

Saya menggunakan netcfg-wvdialdari AUR untuk melakukan panggilan.

gila
sumber

Jawaban:

11

Masalah Anda dapat diselesaikan dengan menggunakan systemd semata-mata, hanya dengan menentukan bahwa layanan Anda Membutuhkan atau, bahkan lebih baik, Mengikat ke perangkat yang diberikan.

Mengutip:

"Jika salah satu unit [yang diperlukan / terikat] lain dinonaktifkan atau aktivasi gagal, unit ini [layanan] akan dinonaktifkan"

Anda hanya perlu mengedit file layanan Anda seperti berikut ini.

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

Catatan: untuk mendapatkan daftar semua file unit perangkat yang tersedia gunakan systemctl list-units --all --full | grep ".device"

brunocodutra
sumber
Apakah ini berarti saya tidak memerlukan aturan udev? Saya mencoba melakukan seperti yang Anda sarankan, dengan membuat file layanan baru untuk mengganti netcfg @ wvdial.service dan termasuk dua baris itu. Tampaknya menghentikan layanan sekarang, tetapi tidak memulai ketika perangkat dicolokkan lagi.
crazystick
@crazystick Anda masih memerlukan aturan udev untuk memulai layanan, yang saya maksud adalah Anda tidak perlu menggunakan udev untuk menghentikannya.
brunocodutra
Oke. Bekerja sangat baik dengan aturan udev dan file layanan yang dimodifikasi.
crazystick
2
Anda dapat menggunakan StopWhenUnneeded=truebukannya BindsTodanAfter
SergA
@SergA pada saat saya menjawab ini ada bug yang mencegah StopWhenUnneeded=truebekerja, tapi saya yakin itu sudah diperbaiki untuk beberapa saat sekarang.
brunocodutra