Adicionando regras do udev resulta em timeout de rede do systemd

1

Estou tentando fazer com que o udev execute certos scripts quando meu laptop está conectado ao carregador ou desconectado dele.

Para isso, criei um arquivo 99-local.rules em /etc/udev/rules.d e coloquei o seguinte:

ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/sbin/onchg.sh"
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/sbin/onbatt.sh"

No entanto, com o arquivo em vigor, o sistema parece travar por algum tempo durante o destino "Aumentar interfaces de rede", que expira após 2min dos 5min exibidos.

Se eu remover o arquivo, ele está funcionando bem.

Como o udev é relacionado à inicialização de interfaces de rede, e como posso fazer com que ele inicialize tão rápido, mas mantendo essas regras?

    
por Vladislav Korotnev 27.09.2018 / 11:58

2 respostas

0

Uma relação é essa udevadm settle na saída de systemctl cat networking :

ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ] && udevadm settle'

Considere o que man udev tem a dizer sobre a chave RUN :

This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device.

Starting daemons or other long-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.

    
por 28.09.2018 / 14:58
0

A resposta fornecida por Ferenc me deu uma pista de que a questão pode estar relacionada aos meus próprios scripts.

Na verdade, os scripts devem trocar a GPU e reiniciar o servidor X (LightDM) sempre que eu encaixar / desacoplar meu laptop.

Então, parece que o udev executou os scripts durante a inicialização, então eles estavam tentando reiniciar o X e obviamente falharam.

Eu adicionei o seguinte código ao topo do meu onbat.sh / onchg.sh e agora tudo funciona perfeitamente:

# Check if LightDM has already arrived
systemctl status lightdm | grep "running"
not_running=$?
if (( $not_running > 0 ))
then
    # LightDM not arrived, exiting for now...
    echo "LightDM not arrived, won't switch GPU."
    exit
fi
    
por 01.10.2018 / 14:03