systemd: iniciar serviço que depende de sockets não funciona

1

Estou usando o systemd para iniciar um script de serviço do WiFi e do monitor de energia que procura um SSID, ativa a rede e um túnel SSH e executa algumas outras tarefas.

Para minha surpresa, nem sempre funciona na inicialização a frio (mas em uma inicialização a quente). O inicial "ifconfig mlan0 up" falha. Isso parece estar vinculado a uma condição de corrida com dependência de sockets:

root@duovero:~# systemctl status wifipwrmon
....

Jan 01 00:00:08 duovero wifipwrmon.sh[415]: ifconfig: SIOCGIFFLAGS: No such ...e
Jan 01 00:00:17 duovero wifipwrmon.sh[415]: Searching for WiFi routers

Este é um exemplo um pouco inventado porque eu posso apenas reemitir o ifconfig. Mas também tenho outro serviço que depende de sockets para IPC. Isso falha totalmente na inicialização, a menos que eu coloque um longo atraso antes de iniciá-lo.

Isso é o que eu uso para o wifipwrmon.service:

[Unit]
Description=WiFi power monitor service
[email protected]
[email protected]

[Service]
ExecStart=/home/root/i2c/monitor/wifipwrmon.sh

[Install]
WantedBy=multi-user.target

Admito que estou acostumado com o sysvinit e sou novo no systemd e tive pouco tempo quando fiz isso. Como eu queria começar muito tarde eu coloquei uma dependência de getty começando (provavelmente uma coisa nova para fazer).

Alguém pode me dizer qual deve ser a dependência para iniciar um serviço que depende de comunicações de soquete? Fiquei muito surpreso por ter falhado - achei os soquetes tão críticos que seria no kernel.

    
por carveone 20.04.2014 / 16:42

1 resposta

0

Até onde eu sei, o problema não está relacionado a soquetes, mas está relacionado à inicialização de dispositivos.

Na inicialização do serviço systemd e na inicialização do dispositivo, é executado paralelamente. O que acontece no seu caso é que na inicialização a frio o seu dispositivo wifi demora mais para inicializar e seu serviço é iniciado antes de ser disponibilizado, resultando na falha do ifconfig

você pode usar algo como:

[Unit]
BindTo=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device

no seu arquivo de serviço, para solicitar sua unidade após o aparecimento do dispositivo sem fio.

    
por 14.06.2014 / 23:45