Existe uma maneira de um serviço systemd descobrir um caminho de dispositivo e reiniciar se ele mudar?

2

Estou executando um daemon que precisa de um caminho para um dispositivo quando ele é iniciado. Este dispositivo está conectado ao barramento USB, mas às vezes desconecta o USB e reconecta novamente (um conector frouxo ou um hardware danificado, ainda não encontrou o problema) e, em seguida, o dispositivo recebe outro nome, digamos, /dev/ttyACM0 se torna /dev/ttyACM1 .

É uma porta serial virtual que envia dados NMEA de um receptor AIS (Quark-elec QK-A022 para os interessados).

Tenho certeza de que apenas um dispositivo será conectado ao mesmo tempo ao USB.

Existe uma maneira de iniciar / reiniciar um serviço com o systemd quando um tipo específico de dispositivo é inserido no sistema? Eu notei systemctl list-units --type=device , que lista o dispositivo, então estou esperançoso, mas cada exemplo que eu encontrei até agora é baseado em iniciar explicitamente o servicename @ device.

root@ais:/home/pi# systemctl list-units --type=device | fgrep STM
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.2-1\x2d1.2:1.0-tty-ttyACM1.device                      loaded active plugged STM32F407

Tenho certeza de que apenas um dispositivo será conectado ao mesmo tempo ao USB.

    
por Mrten 27.05.2018 / 00:33

2 respostas

0

Hoje em dia, a maneira canônica de executar um daemon quando um dispositivo está conectado parece ser criar uma unidade do systemd para o daemon e adicionar uma entrada do udev para o dispositivo referente a esta unidade. Por exemplo, crie um arquivo /etc/udev/rules.d/90-my.rules com a linha

ACTION=="add", KERNEL=="ttyACM*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myacm@%k.service"

e um arquivo /etc/systemd/system/[email protected] com

[Unit]
Description=my serial daemon for ttyACM0
[Service]
ExecStart=/bin/myscript %i

Você pode precisar de sudo udevadm control --reload e sudo systemctl daemon-reload . Quando você conecta seu dispositivo, seu script deve ser executado com o parâmetro ttyACM0 , se esse for o nome dele. Verifique os arquivos de log em busca de erros.

Veja man 7 daemon seção Daemons de Novo Estilo e Ativação Baseada em Dispositivo , bem como man systemd.device .

    
por 28.05.2018 / 14:54
0

Eu não sei se você pode fazer isso dentro do systemd, mas você pode usar o udev para reiniciar / recarregar o serviço se ele detectar uma alteração de dispositivo.

    
por 27.05.2018 / 00:57