Como posso executar um script quando a fonte de alimentação está conectada ou desativada?

8

Por alguma razão, o brilho da tela do meu laptop não é atualizado quando conecto ou desconecto a fonte de alimentação. Analisei algumas soluções para esse problema, mas nenhuma delas parecia funcionar bem. Então, em vez de desesperar e desistir, decidi tentar transformar isso em uma experiência de aprendizado e ver se não consigo escrever um script que faça isso por mim.

Tentei descobrir isso sozinho, com alguma ajuda da internet, é claro, mas sou muito novo em bash scripts e Ubuntu em geral, então não fui longe.

O que eu consegui descobrir foi que eu posso encontrar o estado da bateria com

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

dependendo se o adaptador CA está ou não conectado. Não sei se isso é útil, mas é bem legal e eu não sabia como usá-lo grepantes, então que diabos, aprender é divertido.

De qualquer forma, existe uma maneira um pouco limpa de fazer isso? Por "maneira limpa", quero dizer apenas uma maneira que alguém com experiência limitada em scripts do bash poderia compreender.

Uma pergunta semelhante que achei que tinha uma boa resposta é essa , que diz o seguinte:

Ao conectar / desconectar o adaptador CA, os scripts /etc/pm/power.dsão chamados com> um argumento: "true" (se você estiver usando a bateria) ou "false" (se você estiver usando o adaptador>).

O problema é que não sei como acessar esse argumento de dentro de um script. Então, acho que tudo se resume a um problema bastante simples, mas pensei em postar a pergunta de qualquer maneira, caso as pessoas tivessem melhores soluções.

Jaspe
fonte

Respostas:

5

Você pode usar on_ac_powerpara executar um script quando a fonte de alimentação está ligada ou desligada.

Tente o seguinte em um terminal.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Com base nisso, você pode criar seu script como,

#!/bin/bash
while true
do
    if on_ac_power; then 
        do_something               ## Laptop on power
    else
        do_something_else          ## Laptop on battery
    fi
    sleep 10                       ## wait 10 sec before repeating
done

EDIT: [sugerido por KasiyA ]

cron job seria uma idéia melhor para executar o script em um intervalo regular, em vez de usar um loop infinito.

Salve seu script como myscript.she coloque nele o seguinte conteúdo,

#!/bin/bash
if on_ac_power; then 
    do_something
else
    do_something_else
fi

Torne o script executável a partir de um terminal chmod +x /path/to/myscript.sh,. Abra seu pessoal crontabcomo EDITOR=gedit crontab -ee acrescente a seguinte linha para executar seu script a cada minuto.

* * * * * /path/to/myscript.sh 
souravc
fonte
É uma prática ruim ter scripts em execução infinitamente, ou isso é algo que acontece regularmente e é incorporado ao sistema? Acho que estava procurando algum tipo de gatilho, mas se isso funcionar, será muito menos complicado do que eu imaginava.
Jasper
@TheQZ: Eu acho que 'souravc' deu o básico idea..you pode escrever seu próprio baseado nesta :)
heemayl
@TheQZ Embora ele funcione para sempre, mas se torne ativo apenas uma vez a cada 10 s (você pode aumentar o tempo de verificação) Veja a pergunta sobre como repetir um comando a cada intervalo de tempo x . Caso contrário, você precisará escrever seu próprio programa daemon, o que é muito complicado para os iniciantes.
souravc
@TheQZ Você pode usar a resposta de souravc como um trabalho cron . veja minha
αғsнιη
2
Uma maneira melhor é usar a regra do udev como em askubuntu.com/questions/613741/… .
Anthony Wong