¿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.