I've seen "How to write a systemd service that depends on a device being present?" but that doesn't seem to be about plugging it in, just about it being present.
É muito parecido, só você precisa da dependência oposta: em vez de (ou talvez além do) serviço dependendo do dispositivo, você quer que a unidade virtual dispositivo dependa do seu serviço.
De fato, apesar do título da pergunta vinculada aparentemente fazer o oposto, a resposta aceita o encadeamento já documenta um dos métodos exatos que faria o dispositivo iniciar um serviço (o método de regra do udev).
Mas se você tiver um nome de unidade exato .dispositivo, é mais simples usar as dependências do systemd diretamente:
Se o caminho exato do sysfs for conhecido:
Por exemplo, você determinou que o dispositivo é sys-subsystem-net-devices-usb0.device . Você pode usar várias maneiras de expandir essa unidade (apesar de ser virtual), como foo.device.d/*.conf
drop-ins ou foo.device.wants/
symlinks (que funcionam da mesma forma como, por exemplo, multi-user.target.wants / ).
-
Você pode adicionar uma configuração
[Install]
ao seu serviço e, em seguida, ativar systemctl :[Install] WantedBy=sys-subsystem-net-devices-%i.device
-
Ou você pode obter o mesmo resultado diretamente com
systemctl add-wants
:# systemctl add-wants sys-subsystem-net-devices-usb0.device [email protected]
-
Ambos os métodos resultam em um link simbólico que pode ser feito manualmente via
ln -s
.
Isso geralmente funciona da mesma forma para as unidades do usuário.
Se apenas o nome parcial (ou alguma combinação de outras propriedades) for conhecido:
Escreva uma regra do udev que corresponda ao seu dispositivo (a sintaxe exata da regra do udev está fora do escopo aqui) e defina a propriedade SYSTEMD_WANTS
udev (também conhecida como "variável de ambiente do dispositivo") indicando sua unidade:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb*", ENV{SYSTEMD_WANTS}+="netctl-ifplugd@%k.service"
Como todos os arquivos *.rules
são processados em ordem alfabética, certifique-se de que sua regra seja colocada depois das regras de "interfaces de rede persistentes" do próprio systemd.
Isso funciona com as unidades do usuário, se você usar ENV{SYSTEMD_USER_WANTS}
.
Você pode se sentir tentado a usar RUN+="/bin/systemctl start foo"
via udev. Não faça isso. Mas se você fizer isso, use pelo menos a opção systemctl --no-block
para não criar um possível impasse entre os dois componentes.