
Para ahorrar batería, me gustaría desactivar los efectos (compositor) cada vez que la computadora portátil funciona con batería. Pensé en lograr esto con las reglas de udev.
- Creó un archivo
/etc/udev/rules.d/99-myrule.rules
:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"
Se supone que esta regla se activa cada vez que conecta/desconecta la CA de la computadora portátil.
Luego actualizo las reglas con:sudo udevadm control -R
Lamentablemente, esto no activa nada al conectar/desconectar mi fuente de alimentación.
Mi sistema es Arch Linux.
Respuesta1
TL;DR:
Cree una regla udev y ejecute un script para finalizar su aplicación (compton) al desconectarse la CA.
Iniciarlo de nuevo no es sencillo: cree un servicio systemd para iniciar su aplicación y luego use una regla udev para iniciar ese servicio.
Para probar sus reglas udev, use
udevadm control --reload-rules && udevadm trigger
Respuesta:
Entonces encontré una solución que funciona. La pregunta estaba compuesta de 2 preguntas, así que vamos a desglosarla:
- Escriba la regla udev para que se ejecute con CA/conectar/desconectar la batería.
- Cómo iniciar una aplicación gui como compton desde una regla udev.
Escriba la regla udev para ejecutarla con corriente alterna/conectar/desconectar la batería:
crea un archivo /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"
y crear archivo /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 cómo POWER_SUPPLY_ONLINE
está el entorno, rodeado deENV{...}
Además, si desea conocer los atributos de sus propias reglas, controle lo que ve el udev con:
udevadm monitor --environment
Si su script es simplemente una tarea en segundo plano y no llama a ningún proceso relacionado con la GUI, ¡entonces ya está! De lo contrario, sigue leyendo:
Cómo iniciar una aplicación gui como compton desde una regla udev:
Dehombre udevsobre el uso de EJECUTAR:
"Esto sólo se puede utilizar para tareas de ejecución muy corta..."
Lo que significa que deberíamos usar algo persistente como unsistemadservicio. Cree un archivo de servicio: /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
Reemplace USERNAME
con su nombre de usuario.
%h
y %t
son especificadores reemplazados por $HOME
y /run
o $XDG_RUNTIME_DIR
. Ver systemd.unit(5)
para más detalles.
La línea Environment="XAUTHORITY=/home/USERNAME/.Xauthority"
es imprescindible si desea una aplicación GUI. Por favor miraEsta respuesta.
Y finalmente, en su regla udev, en lugar de iniciar su aplicación GUI (en nuestro caso compton), inicie el servicio:
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/systemctl start compton"
Respuesta2
La respuesta existente me ayudó a comenzar, pero pensé que compartiría el resultado final para mí: mi caso de uso era hacer algo (en realidad, apagar y encender un enchufe/relé inteligente debido a un problema extraño de la fuente de alimentación) cuando una computadora portátil perdía energía de CA.
Me tropecé porque las reglas de udev no deberían ser de varias líneas y, si lo son, deberían escaparse.
Esto es con lo que terminé:
# 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.sh
hace una llamada de red por lo que no se puede invocar directamente desde udev debido a la zona de pruebas, y no pude empezar a at
trabajar, pero systemd funcionó bien.
Recursos interesantes, que podrían utilizarse para mejorar lo anterior: