Systemd altında bir hizmeti durdurmak için udev kuralı yazmanın doğru yolu nedir


12

Arch Linux çalıştırıyorum ve bir aygıt takıldığında bir hizmeti başlatan bir udev kuralı var. Bu durumda, bir 3G modem takıldığında bir bağlantı arar.

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

Ancak, aygıt kaldırılırsa, systemd hizmeti durdurmaz ve bu nedenle tekrar takıldığında, zaten çalıştığından hizmeti başlatmaz.

Ne gerek cihaz hizmeti durdurmak için kaldırıldığında çalışan eşleşen bir udev kuralıdır.

Güncelleme

Aşağıdaki cevabı kullanarak, şu anda sahip olduğum şu udev kuralı

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

aşağıdaki hizmet dosyasıyla (temel olarak netcfg hizmet dosyasından kopyalandı ve yapıştırıldı:

[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-wvdialArama yapmak için AUR'dan kullanıyorum .

Yanıtlar:


11

Sorununuz, yalnızca hizmetinizin belirtilen cihaza BindsTo gerektirdiğini veya daha da iyisi belirterek systemd kullanılarak çözülebilir .

Alıntı yapmak:

"Diğer [gerekli / bağlı] birimlerden biri devre dışı bırakılırsa veya etkinleştirilmesi başarısız olursa, bu birim [hizmet] devre dışı bırakılır"

Hizmet dosyanızı aşağıdaki gibi düzenlemeniz yeterlidir.

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

Not: Kullanılabilir tüm cihaz birimi dosyalarının bir listesini almak için systemctl list-units --all --full | grep ".device"


Bu udev kuralına ihtiyacım olmadığı anlamına mı geliyor? Netcfg @ wvdial.service'in yerini alacak yeni bir hizmet dosyası oluşturarak ve bu iki satırı ekleyerek önerdiğiniz gibi yapmaya çalıştım. Hizmeti şimdi durdurmuş gibi görünüyor, ancak cihaz tekrar takıldığında başlamıyor.
crazystick

@crazystick hala hizmeti başlatmak için udev kuralına ihtiyacınız var, demek istediğim bunu durdurmak için udev kullanmanız gerekmeyecek.
brunocodutra

Anladım. Hem udev kuralı hem de değiştirilmiş hizmet dosyasıyla çok güzel çalışır.
crazystick

2
Bunun StopWhenUnneeded=trueyerine kullanabilirsiniz BindsToveAfter
SergA

@SergA bunu cevapladığım zaman çalışmayı önleyen bir hata vardı StopWhenUnneeded=true, ama bir süredir düzeltildiğine inanıyorum.
brunocodutra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.