¿Cuál es la forma correcta de escribir una regla udev para detener un servicio en systemd?


12

Estoy ejecutando Arch Linux, y tengo una regla udev que inicia un servicio cuando se inserta un dispositivo. En este caso, marca una conexión cuando se conecta un módem 3G.

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

Sin embargo, si se retira el dispositivo, systemd no detendrá el servicio y, por lo tanto, cuando se vuelva a enchufar, no lo iniciará, ya que ya se está ejecutando.

Lo que necesito es una regla udev coincidente que se ejecuta cuando se retira el dispositivo para detener el servicio.

Actualizar

Usando la respuesta a continuación, lo que ahora tengo es la siguiente regla de udev

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

con el siguiente archivo de servicio (que básicamente se copió y pegó del archivo de servicio 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

Estoy usando netcfg-wvdialde AUR para hacer la marcación.

Respuestas:


11

Su problema puede resolverse utilizando systemd únicamente, simplemente especificando que su servicio requiere o, mejor aún, BindsTo para el dispositivo dado.

Citando:

"Si una de las otras unidades [requeridas / vinculadas a] se desactiva o su activación falla, esta unidad [servicio] se desactivará"

Solo necesita editar su archivo de servicio de la siguiente manera.

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

Nota: para obtener una lista de todos los archivos de unidad de dispositivo disponibles, utilice systemctl list-units --all --full | grep ".device"


¿Significa esto que no necesito la regla udev? Traté de hacer lo que sugirió, creando un nuevo archivo de servicio para reemplazar el netcfg @ wvdial.service e incluyendo esas dos líneas. Parece detener el servicio ahora, pero no lo inicia cuando el dispositivo se vuelve a enchufar.
crazystick

@crazystick todavía necesita la regla de udev para iniciar el servicio, lo que quise decir es que no necesitará usar udev para detenerlo.
brunocodutra

Entendido. Funciona muy bien con la regla udev y el archivo de servicio modificado.
crazystick

2
Puede usar StopWhenUnneeded=trueen su lugar BindsToyAfter
SergA

@SergA cuando respondí esto, había un error que impedía que StopWhenUnneeded=truefuncionara, pero creo que se ha solucionado durante bastante tiempo.
brunocodutra
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.