Qual é a maneira correta de escrever uma regra do udev para parar um serviço no systemd

10

Estou executando o Arch Linux e tenho uma regra do udev que inicia um serviço quando um dispositivo é inserido. Neste caso, disca uma conexão quando um modem 3G é conectado.

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

No entanto, se o dispositivo for removido, o systemd não parará o serviço e, portanto, quando ele for conectado novamente, ele não iniciará o serviço, pois ele já está em execução.

O que eu preciso é de uma regra do udev correspondente que seja executada quando o dispositivo for removido para interromper o serviço.

Atualizar

Usando a resposta abaixo, o que eu tenho agora é a seguinte regra do udev

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

com o seguinte arquivo de serviço (que foi basicamente copiado e colado do arquivo de serviço 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

Estou usando netcfg-wvdial do AUR para fazer a discagem.

    
por crazystick 31.01.2013 / 12:24

1 resposta

9

Seu problema pode ser resolvido usando apenas o systemd, simplesmente especificando que o seu serviço Requer ou, melhor ainda, Vincula a ao dispositivo em questão.

Citações:

"Se um dos outros [requeridos / vinculados a] unidades fica desativado ou sua ativação falha, esta unidade [serviço] será desativada "

Você só precisa editar seu arquivo de serviço como o seguinte.

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

Nota: para obter uma lista de todos os arquivos de unidade de dispositivo disponíveis, use systemctl list-units --all --full | grep ".device"

    
por 08.09.2013 / 23:31