Executa o serviço depois que ttyUSB0 se torna disponível

2

Eu fiz um serviço systemd que lança um simples .sh para ler dados de uma conexão serial. Se eu executar o serviço manualmente após a inicialização, ele funciona bem, mas quando tento executá-lo automaticamente na inicialização, ele falha porque o .sh ainda não pode ler de ttyUSB0 ( awk: fatal: cannot open file /dev/ttyUSB0' for reading (No such file or directory ).

Existe alguma maneira de fazer o serviço esperar por ttyUSB0 e, em seguida, executar o .sh? Eu tentei algo como after = ttyUSB0 mas isso não funciona.

[Unit] 
Description=Serial logger

[Service] 
ExecStart=/serial_script.sh

[Install] 
WantedBy=default.target
    
por sjaak 10.04.2018 / 04:03

1 resposta

3

Considere o uso de uma regra udev em vez de um serviço systemd para iniciar seu script.

Algo parecido com isto em /etc/udev/rules.d/99-serial-logger.rules :

SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB0", RUN+="/serial_script.sh"

Ou se você quiser manter o script como um serviço systemd (por exemplo, para permitir que ele seja controlado usando o comando systemctl ), remova a linha WantedBy=default.target do seu serviço e torne sua regra udev assim:

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="your-serial-logger.service"

Como resultado, udev deve informar systemd para iniciar seu serviço quando o dispositivo aparecer e pará-lo se / quando o dispositivo for removido.

    
por 10.04.2018 / 10:59