Evento do sistema na inserção do adaptador AC ou na bateria desconectada?

4

O Ubuntu 15.04 (ou talvez apenas Linux em geral) tem algum tipo de evento mensurável que é acionado quando a energia CA de um laptop é desconectada e a unidade muda para a energia da bateria?

Eu gostaria de escrever um pequeno programa que aguarda esse evento e, em seguida, faça alguns ajustes em coisas como o brilho da tela, por exemplo. Eu sei que existem algumas soluções para isso, mas estou tentando me ensinar ao mesmo tempo. Sou novo (ish) para o Linux e fiz a maioria da minha codificação em .NET em sistemas Windows.

Eu vi informações de status da bateria em /sys/class/power_supply/ , mas estou supondo que deve haver uma maneira melhor de determinar se o adaptador foi desconectado, em vez de apenas verificar se há alterações nos arquivos em algum tipo de timer.

Eu tentei pesquisar no Google e nesses fóruns, mas ainda não descobri como posicionar corretamente a pesquisa.

    
por armadadrive 06.09.2015 / 22:42

1 resposta

12

Você está procurando por udev , que detecta alterações em vários estados do sistema, incluindo conectar dispositivos (ou desconectá-los). Você pode fazer o script do udev para realizar alguma ação quando um dispositivo é anexado ou removido.

O Udev é, francamente, bastante complexo, e você vai querer fazer alguns testes realmente básicos para ter certeza de que está detectando o que está procurando.

Os passos básicos são estes:

Monitore seu sistema:

sudo udevadm monitor

Isso informa o que o udev "vê".

Com esta execução, conecte a fonte de alimentação e veja o que o udevadm lhe diz. Desligue-o novamente: veja o que o udevadm lhe diz. Provavelmente não fará sentido ainda, mas tudo bem; você sabe como monitorar o udev agora, e isso é útil.

Pare esse processo e faça o seguinte:

sudo udevadm info --path=/sys/class/power_supply/ac

ou

sudo udevadm info --path=/sys/class/power_supply/battery

que fornece informações sobre os sistemas AC e BATTERY. Assim:

P: /devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery
E: DEVPATH=/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery
E: POWER_SUPPLY_CAPACITY=100
E: POWER_SUPPLY_CURRENT_NOW=0
E: POWER_SUPPLY_ENERGY_FULL_DESIGN=3200
E: POWER_SUPPLY_HEALTH=Good
E: POWER_SUPPLY_MODEL_NAME=battery
E: POWER_SUPPLY_NAME=battery
E: POWER_SUPPLY_ONLINE=0
E: POWER_SUPPLY_PRESENT=0
E: POWER_SUPPLY_STATUS=Full
E: POWER_SUPPLY_TECHNOLOGY=Li-ion
E: POWER_SUPPLY_TEMP=300
E: POWER_SUPPLY_VOLTAGE_MAX_DESIGN=4200000
E: POWER_SUPPLY_VOLTAGE_MIN_DESIGN=3300
E: POWER_SUPPLY_VOLTAGE_NOW=0
E: SUBSYSTEM=power_supply

As linhas E: são atributos de ambiente que você pode usar para gravar uma regra do udev.

Escreva uma regra básica do udev (eu normalmente apenas escrevo um para criar uma entrada de log em algum lugar do meu disco quando o evento acontece; dessa forma, sei que estou acionando algo. Depois volto e faço o script útil.) / p>

Por exemplo: SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Charging", RUN+="/path/to/some/script.sh"

ou você pode usar POWER_SUPPLY_PRESENT=1 ... você terá que experimentar com base nos valores exibidos no seu computador.

Coloque este script do udev em /etc/udev/rules.d (um nome como 80.power.rules seria convencional) e reinicie seu computador. Tecnicamente, você pode simplesmente reiniciar o udev, mas acho que não é confiável.

Veja se o seu script é acionado quando o seu AC está conectado.

Refine sua regra do udev e o script que ela aciona.

Há muito mais para udev, então mergulhe!

    
por 07.09.2015 / 07:20