¿Cómo hago para que mi computadora portátil entre en suspensión cuando alcanza un umbral de batería baja?

¿Cómo hago para que mi computadora portátil entre en suspensión cuando alcanza un umbral de batería baja?

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 -ey 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.confla 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.confson:

PercentageAction=2
CriticalPowerAction=HybridSleep

También puedes usar TimeActionjunto con UsePercentageForPolicy=falsepara dejar que la acción se lleve a cabo una vez que solo quede el tiempo especificado:

TimeAction=120

Los valores válidos para CriticalPowerActionson PowerOffy Hibernate. HybridSleepSi 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-batteryque 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 suspendcon hybrid-sleep, hibernateo powerofflo que mejor se adapte a tus necesidades.

No se requieren herramientas externas, ni siquiera el acpipaquete. 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-funcslos detalles).

Que hace:cada 5 minutos ( */5puede 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 -risolo 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 205De forma predeterminada, enviará KEY_SUSPENDun 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 205por supuesto: like hibernate(del paquete hibernate), s2disko 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)

información relacionada