regra udev para iniciar um comando no evento AC/Battery plug/unplug

regra udev para iniciar um comando no evento AC/Battery plug/unplug

Para economizar bateria, gostaria de desligar os efeitos (compositor) sempre que o laptop funcionar com bateria. Pensei em conseguir isso com as regras do udev.

  • Criou um arquivo /etc/udev/rules.d/99-myrule.rules:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

Esta regra deve ser acionada sempre que você conectar/desconectar o AC do laptop.

Em seguida, atualizo as regras com:sudo udevadm control -R

Infelizmente, isso não aciona nada ao conectar/desconectar minha fonte de alimentação.

Meu sistema é Arch linux.

Responder1

DR:

  1. Faça uma regra do udev executar um script para encerrar seu aplicativo (compton) na desconexão AC.

  2. Iniciá-lo novamente não é simples - crie um serviço systemd para iniciar seu aplicativo e, em seguida, use uma regra udev para iniciar esse serviço.

  3. Para testar suas regras do udev, useudevadm control --reload-rules && udevadm trigger


Responder:

Então encontrei uma solução funcional. A pergunta foi composta por 2 perguntas, então vamos decompô-la:

  1. Escreva a regra do udev para ser executada com plug/desconecte CA/bateria.
  2. Como iniciar um aplicativo GUI como Compton a partir de uma regra do udev.

Escreva a regra do udev para ser executada com plug/desconecte CA/bateria:

criar arquivo /etc/udev/rules.d/60-onbattery.rules:

# Rule for when switching to battery
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="0",RUN+="/bin/killcompton.sh"

e crie o arquivo /etc/udev/rules.d/61-onpower.rules:

# Rule for when switching to powersupply
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/startcompton.sh"

Observe como POWER_SUPPLY_ONLINEé do ambiente, cercado porENV{...}

Além disso, se você quiser saber os atributos de suas próprias regras, monitore o que o udev vê com: udevadm monitor --environment

Se o seu script for simplesmente uma tarefa em segundo plano e não chamar nenhum processo relacionado à GUI, pronto! Caso contrário, continue lendo:

Como iniciar um aplicativo GUI como Compton a partir de uma regra do udev:

Dehomem udevsobre como usar RUN:

"Isso só pode ser usado para tarefas de execução muito curta..."

O que significa que devemos usar algo persistente como umsistemaserviço. Crie um arquivo de serviço /etc/systemd/system/compton.service::

[Unit]
Description=Start compton

[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=%h/.Xauthority"
User=USERNAME
ExecStart=/bin/compton --blur-method kawase --write-pid-path %t/compton.pid
PIDFile=%t/compton.pid

[Install]
WantedBy=default.target

Substitua USERNAMEpelo seu nome de usuário.

%he %tos especificadores são substituídos por $HOMEe /runou $XDG_RUNTIME_DIR. Veja systemd.unit(5)para mais detalhes.

A linha Environment="XAUTHORITY=/home/USERNAME/.Xauthority"é obrigatória se você deseja um aplicativo GUI. Por favor, vejaEsta resposta.

E finalmente, na sua regra udev, em vez de iniciar seu aplicativo GUI (no nosso caso compton), inicie o serviço:

SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/systemctl start compton"

Responder2

A resposta existente me ajudou a começar, mas decidi compartilhar o resultado final para mim - meu caso de uso era fazer algo (na verdade, desligar e ligar um plugue/relé inteligente por causa de um problema estranho de fonte de alimentação) quando um laptop perdia energia CA.

Eu tropecei porque as regras do udev não deveriam ser multilinhas e, se fossem, deveriam ser escapadas.

Aqui está o que acabei:

# cat /etc/udev/rules.d/90-onbattery.rules                                                                                                                                                                                   
SUBSYSTEM=="power_supply",\
  ENV{POWER_SUPPLY_NAME}=="ADP1",\
  ENV{POWER_SUPPLY_ONLINE}=="0",\
  RUN+="/usr/bin/systemctl start power-cycle-outlet.service"
# cat /etc/systemd/system/power-cycle-outlet.service                                                                                                                                                                         
[Unit]
Description=Power Cycle Outlet via Home Assistant

[Service]
User=root
Type=simple
GuessMainPID=false
ExecStart=/usr/sbin/trigger-outlet-powercycle.sh

trigger-outlet-powercycle.shfaz uma chamada de rede para que não possa ser chamada diretamente do udev devido ao sandbox, e não consegui attrabalhar, mas o systemd funcionou bem.

Recursos interessantes, que poderiam ser usados ​​para melhorar o acima exposto:

informação relacionada