¿Cómo puedo ejecutar un script cuando la fuente de alimentación está enchufada o desconectada?

8

Por alguna razón, el brillo de la pantalla de mi computadora portátil no se actualiza cuando conecto o desconecto la fuente de alimentación. He visto bastantes soluciones para ese problema, pero ninguna de ellas parecía funcionar bien. Entonces, en lugar de desesperarme y rendirme, decidí tratar de convertir esto en una experiencia de aprendizaje y ver si no puedo escribir un guión que lo haga por mí.

Intenté resolverlo por mi cuenta, con un poco de ayuda de Internet, por supuesto, pero soy bastante nuevo en bash scripting y Ubuntu en general, así que no llegué lejos.

Lo que pude descubrir fue que puedo encontrar el estado de la batería con

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

dependiendo de si el adaptador de CA está enchufado o no. No sé si eso es útil, pero es genial, y no sabía cómo usarlo grepantes, así que qué demonios, aprender es divertido.

De todos modos, ¿hay alguna forma limpia de hacer esto? Por "manera limpia" me refiero a una forma que alguien con experiencia limitada en script bash podría comprender.

Una pregunta similar que encontré que tenía una buena respuesta es esta , que dice lo siguiente:

Cuando conecta / desconecta el adaptador de CA, los scripts /etc/pm/power.dse llaman con> un argumento: "verdadero" (si funciona con batería) o "falso" (si se ejecuta con el> adaptador de corriente).

El problema es que no sé cómo acceder a ese argumento desde un script. Entonces, supongo que todo se reduce a un problema bastante simple, pero pensé en publicar la pregunta de todos modos, en caso de que la gente tuviera mejores soluciones.

Jaspe
fuente

Respuestas:

5

Puede usar on_ac_powerpara ejecutar un script cuando la fuente de alimentación está encendida o apagada.

Pruebe lo siguiente en una terminal.

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

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

Basado en esto, puedes hacer tu 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

EDITAR: [sugerido por KasiyA ]

cron job sería una mejor idea para ejecutar el script en un intervalo regular en lugar de usar un bucle infinito.

Guarde su script como myscript.shy ponga el siguiente contenido en él,

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

Haga el script ejecutable desde un terminal, chmod +x /path/to/myscript.sh. Abra su personal crontabcomo EDITOR=gedit crontab -ey agregue la siguiente línea para ejecutar su script cada minuto.

* * * * * /path/to/myscript.sh 
souravc
fuente
¿Es una mala práctica tener secuencias de comandos ejecutándose infinitamente, o es algo que ocurre regularmente y está integrado en el sistema? Supongo que estaba buscando algún tipo de desencadenante, pero si esto funciona, entonces es mucho menos complicado de lo que había supuesto.
Jasper
@TheQZ: Creo que 'souravc' ha dado la idea básica ... puedes escribir la tuya basada en esto :)
heemayl
@TheQZ Aunque se ejecuta para siempre, pero se activa solo una vez cada 10 segundos (puede aumentar el tiempo de verificación) Observe la pregunta de cómo repetir un comando cada intervalo de tiempo . De lo contrario, debe escribir su propio programa de demonios, que es mucho más complicado para los principiantes.
souravc
@TheQZ Puede usar la respuesta de souravc como un trabajo cron . vea la segunda parte de esta respuesta mía
αғsнιη
2
Una mejor manera es usar la regla udev como en askubuntu.com/questions/613741/… .
Anthony Wong