Qual è il modo corretto di scrivere una regola udev per interrompere un servizio in systemd


12

Sto eseguendo Arch Linux e ho una regola udev che avvia un servizio quando viene inserito un dispositivo. In questo caso, compone una connessione quando è collegato un modem 3G.

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

Tuttavia, se il dispositivo viene rimosso, systemd non interromperà il servizio e, quindi, quando viene ricollegato, non avvierà il servizio, poiché è già in esecuzione.

Ciò di cui ho bisogno è una regola udev corrispondente che viene eseguita quando il dispositivo viene rimosso per interrompere il servizio.

Aggiornare

Usando la risposta qui sotto, quello che ho ora è la seguente regola udev

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

con il seguente file di servizio (che è stato sostanzialmente copiato e incollato dal file di servizio 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

Sto usando netcfg-wvdialda AUR per fare la composizione.

Risposte:


11

Il problema può essere risolto utilizzando solo systemd, semplicemente specificando che il servizio richiede o, ancora meglio, si lega al dispositivo specificato.

citando:

"Se una delle altre unità [obbligatorie / associate a] viene disattivata o la sua attivazione non riesce, questa unità [servizio] verrà disattivata"

Hai solo bisogno di modificare il tuo file di servizio come il seguente.

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

Nota: per ottenere un elenco di tutti i file disponibili dell'unità di dispositivo utilizzare systemctl list-units --all --full | grep ".device"


Questo significa che non ho bisogno della regola udev? Ho provato a fare come hai suggerito, creando un nuovo file di servizio per sostituire netcfg @ wvdial.service e includendo quelle due righe. Sembra fermare il servizio ora, ma non lo avvia quando il dispositivo viene ricollegato.
crazystick,

@crazystick hai ancora bisogno della regola udev per avviare il servizio, quello che volevo dire è che non dovrai usare udev per fermarlo.
brunocodutra,

Fatto. Funziona molto bene sia con la regola udev che con il file di servizio modificato.
crazystick,

2
Puoi usare StopWhenUnneeded=trueinvece BindsToeAfter
SergA

@SergA quando ho risposto a questo problema, c'era un bug che impediva il StopWhenUnneeded=truefunzionamento, ma credo che sia stato corretto da un po 'di tempo.
brunocodutra,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.