
Estoy usando Ubuntu, pero tengo i3 como administrador de ventanas en lugar de un entorno de escritorio.
Cuando mi batería llega al 0%, la computadora se apaga abruptamente, sin previo aviso ni nada.
¿Existe algún script o configuración simple que pueda configurar para que entre en modo de suspensión, digamos con un 4 % de batería?
Respuesta1
Aquí hay un pequeño script que verifica el nivel de la batería y llama a un comando personalizado, aquí pm-hibernate
, en caso de que el nivel de la batería esté por debajo de cierto umbral.
#!/bin/sh
###########################################################################
#
# Usage: system-low-battery
#
# Checks if the battery level is low. If “low_threshold” is exceeded
# a system notification is displayed, if “critical_threshold” is exceeded
# a popup window is displayed as well. If “OK” is pressed, the system
# shuts down after “timeout” seconds. If “Cancel” is pressed the script
# does nothing.
#
# This script is supposed to be called from a cron job.
#
###########################################################################
# This is required because the script is invoked by cron. Dbus information
# is stored in a file by the following script when a user logs in. Connect
# it to your autostart mechanism of choice.
#
# #!/bin/sh
# touch $HOME/.dbus/Xdbus
# chmod 600 $HOME/.dbus/Xdbus
# env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
# echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
# exit 0
#
if [ -r ~/.dbus/Xdbus ]; then
source ~/.dbus/Xdbus
fi
low_threshold=10
critical_threshold=4
timeout=59
shutdown_cmd='/usr/sbin/pm-hibernate'
level=$(cat /sys/devices/platform/smapi/BAT0/remaining_percent)
state=$(cat /sys/devices/platform/smapi/BAT0/state)
if [ x"$state" != x'discharging' ]; then
exit 0
fi
do_shutdown() {
sleep $timeout && kill $zenity_pid 2>/dev/null
if [ x"$state" != x'discharging' ]; then
exit 0
else
$shutdown_cmd
fi
}
if [ "$level" -gt $critical_threshold ] && [ "$level" -lt $low_threshold ]; then
notify-send "Battery level is low: $level%"
fi
if [ "$level" -lt $critical_threshold ]; then
notify-send -u critical -t 20000 "Battery level is low: $level%" \
'The system is going to shut down in 1 minute.'
DISPLAY=:0 zenity --question --ok-label 'OK' --cancel-label 'Cancel' \
--text "Battery level is low: $level%.\n\n The system is going to shut down in 1 minute." &
zenity_pid=$!
do_shutdown &
shutdown_pid=$!
trap 'kill $shutdown_pid' 1
if ! wait $zenity_pid; then
kill $shutdown_pid 2>/dev/null
fi
fi
exit 0
Es un script muy simple, pero creo que entiendes la idea y puedes adaptarlo fácilmente a tus necesidades. La ruta hasta el nivel de la batería puede ser diferente en su sistema. Probablemente sería un poco más portátil usar algo como acpi | cut -f2 -d,
para obtener el nivel de la batería. Este script puede programarse mediante cron para que se ejecute cada minuto. Edite su crontab crontab -e
y agregue el script:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Otra solución sería instalar un entorno de escritorio como Gnome o Xfce (y cambiar su administrador de ventanas a i3). Ambos entornos de detención mencionados cuentan con demonios de administración de energía que se encargan de apagar la computadora. Pero supongo que no los utilizas deliberadamente y buscas una solución más minimalista.
Respuesta2
En lugar de piratear sus propios scripts y si está utilizando Ubuntu como sugiere la etiqueta, puede simplemente instalar el paquete upower. Debería estar disponible en todos los derivados de Debian, incluido Ubuntu. Por defecto viene con una configuración en /etc/UPower/UPower.conf
la que se activa el sueño híbrido una vez que el nivel de la batería alcanza valores críticos. El valor predeterminado para el nivel crítico es 2%.
Para usuarios de otras distribuciones, las entradas relevantes /etc/UPower/UPower.conf
son:
PercentageAction=2
CriticalPowerAction=HybridSleep
También puedes usar TimeAction
junto con UsePercentageForPolicy=false
para dejar que la acción se lleve a cabo una vez que solo quede el tiempo especificado:
TimeAction=120
Los valores válidos para CriticalPowerAction
son PowerOff
y Hibernate
. HybridSleep
Si HybridSleep está configurado pero no está disponible, se utilizará Hibernación. Si Hibernar está configurado pero no está disponible, se utilizará PowerOff.
La ventaja de HybridSleep es que, además de escribir memoria en su área de intercambio, suspende el sistema. La suspensión seguirá consumiendo algo de batería, pero si regresa antes de que se agote la batería, podrá reanudar mucho más rápidamente desde un sistema suspendido que desde uno hibernado. En caso de que la batería se agote antes de volver a la toma de corriente, puede reanudar el sistema desde la hibernación una vez que vuelva a tener energía.
Respuesta3
A partir de Debian ≥ 10 (y sistemas Linux relativamente recientes), puede simplemente crear un archivo /etc/cron.d/check-battery
que contenga:
* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" != Discharging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 30 ] || systemctl suspend
Esto suspenderá su sistema cuando el nivel de la batería alcance el 30%.
Por supuesto, siéntete libre de reemplazar el final suspend
con hybrid-sleep
, hibernate
o poweroff
lo que mejor se adapte a tus necesidades.
No se requieren herramientas externas, ni siquiera el acpi
paquete. Esto se basa en la idea de la respuesta de Matija Nalis, pero ajustada al año 2023.
Respuesta4
Hay muchas formas de implementarlo, ya que existen muchos esquemas diferentes de administración de energía implementados según lo que haya instalado.
Este sencillo me funciona en el minimalista Debian Jessie sin ningún entorno de escritorio, solo con el pequeño y rápido administrador de ventanas icewm. (Está recortado porque, de lo contrario, es demasiado lento y de esta manera supera a GNOME en un hardware mucho mejor)
Específicamente, SÍ he instalado los siguientes paquetes: acpi acpi-fakekey soporte-acpi base-soporte-acpi acpid pm-utils pero no tiene NINGUNO de los siguientes (habiéndolos purgado): gnome* kde* systemd* uswsusp upower herramientas-modo-portátil hibernación Policykit-1
Así que puse esto /etc/cron.d/battery_low_check
(todo en una línea, dividido para facilitar la lectura):
*/5 * * * * root acpi --battery |
awk -F, '/Discharging/ { if (int($2) < 10) print }' |
xargs -ri acpi_fakekey 205
Es rápido, consume pocos recursos y no depende de otros demonios (de hecho, será ignorado si están activos; consulte /usr/share/acpi-support/policy-funcs
los detalles).
Que hace:cada 5 minutos ( */5
puede cambiar a cada minuto simplemente usándolo *
si lo necesita para verificar la batería con más frecuencia) sondeará el estado de la batería ("acpi-batería") y ejecute el comando después xargs -ri
solo si la batería se está "descargando" (es decir, no está conectado a la CA) y el estado de la batería es inferior a 10%
("entero ($2) < 10" - siéntete libre de ajustarlo a tus necesidades)
acpi_fakekey 205
De forma predeterminada, enviará KEY_SUSPEND
un evento ACPI (como si presionara una tecla en la computadora portátil solicitando suspensión), que luego hará lo que normalmente hace por usted (configurado en /etc/default/acpi-support
); para mí, hiberna en el disco.
Podría usar otro comando en lugar de, acpi_fakekey 205
por supuesto: like hibernate
(del paquete hibernate), s2disk
o s2mem
(del paquete uswsusp), pm-suspend-hybrid
(del paquete pm-utils), etc.
Por cierto, números de clave mágica comoKEY_SUSPEND=205arriba se definen en /usr/share/acpi-support/key-constants
(probablemente otro interesante seaKEY_SLEEP=142)