Como escrever um serviço systemd que depende de um dispositivo estar presente?

7

Eu gostaria de escrever um serviço systemd que depende do dongle USB WiFi estar presente. Não é necessário iniciar quando o dispositivo está conectado, desde que não inicie quando o dispositivo não estiver conectado. Como posso conseguir isso?

O arquivo de consolidação do systemd está no formato network @ .conf. Ele usa o espaço reservado %i . Então, tentei adicionar isso ao arquivo de unidade:

[Path]
PathExists = /dev/%i

Em que %i seria algo como wlan0 . Infelizmente, isso é completamente ignorado, então talvez eu não entenda o uso correto desta seção.

Eu também tentei:

[Unit]
....
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

Eu peguei de algum lugar (eu esqueci onde), e isso não funciona também.

    
por hayavuk 12.12.2014 / 17:13

1 resposta

7

Você precisa combinar udev e systemd .

Adicione uma nova regra para o udev, em /etc/udev/rules.d/95-mywifi.rules, da seguinte forma:

 ACTION=="add", ATTRS{idVendor}=="...", ATTRS{idProduct}=="...", SYMLINK=="mywifi", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"

(Você deve substituir os pontos dos códigos Vendor e Product apropriados para o seu dongle).

O netctl-auto @ .service existente é:

  # cat /lib/systemd/system/netctl-auto\@.service 
  [Unit]
  Description=Automatic wireless network connection using netctl profiles
  Documentation=man:netctl.special(7)
  BindsTo=sys-subsystem-net-devices-%i.device
  After=sys-subsystem-net-devices-%i.device
  Before=network.target
  Wants=network.target

  [Service]
  ExecStart=/usr/bin/netctl-auto start %I
  ExecStop=/usr/bin/netctl-auto stop %I
  RemainAfterExit=yes
  Type=forking

  [Install]
  WantedBy=multi-user.target

Para que isso funcione, você terá que configurar um perfil netctl , veja o Arch Linux Wiki para ver como fazer isso.

    
por 12.12.2014 / 22:59