Aquí hay un pequeño script que verifica el nivel de batería y llama a un comando personalizado, aquí pm-hibernate
, en caso de que el nivel de batería esté por debajo de un 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
. ~/.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 captas la idea y puedes adaptarla fácilmente a tus necesidades. La ruta al nivel de la batería puede ser diferente en su sistema. Un poco más portátil probablemente sería usar algo como acpi | cut -f2 -d,
para obtener el nivel de batería. Cron puede programar este script para que se ejecute cada minuto. Edite su crontab con 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 destop mencionados cuentan con demonios de administración de energía que se encargan de apagar la computadora. Pero supongo que deliberadamente no los usa y está buscando una solución más minimalista.
sleepd -b 40
y no pasó nada después de la marca del 40%. También lo intentésudo sleepd -b 40 -s pm-suspend
y no pasa nada ...cut
".) ¡El guión funciona! Tengoacpi | cut -f2 -d, | cut -f1 d%
- Leeré sobre cron para que se ejecute solo. ¡Gracias!/sys/devices/platform/smapi/
directorio ¿Dónde puedo encontrar el porcentaje restante de energía de la batería? Estoy usando kernel personalizado 3.10/sys/class/power_supply/BAT0/capacity
. De lo contrario, use elacpi
comando.En lugar de hackear sus propios scripts y si está usando Ubuntu como sugiere la etiqueta, simplemente puede instalar el paquete upower. Debería estar disponible en todos los derivados de Debian, incluido Ubuntu. Por defecto, viene con una configuración en la
/etc/UPower/UPower.conf
que se activa la suspensión híbrida una vez que el nivel de la batería alcanza valores críticos. El valor predeterminado para el nivel crítico es 2%.Para los usuarios de otras distribuciones, las entradas relevantes para
/etc/UPower/UPower.conf
son:También puede usar
TimeAction
junto conUsePercentageForPolicy=false
para permitir que la acción se lleve a cabo una vez que solo quede el tiempo especificado:Los valores válidos para
CriticalPowerAction
sonPowerOff
,Hibernate
yHybridSleep
. Si HybridSleep está configurado pero no está disponible, se utilizará Hibernate. Si Hibernate está configurado pero no está disponible, se usará PowerOff.La ventaja de HybridSleep es que, además de escribir memoria en su área de intercambio, suspende el sistema. Suspender aún consumirá algo de batería, pero si regresa antes de que se agote la batería, puede 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 una toma de corriente, puede reanudar el sistema desde la hibernación una vez que tenga energía nuevamente.
fuente
HybridSleep
requiere tener un espacio de intercambio.La respuesta actualmente aceptada es excelente, pero un poco desactualizada para Ubuntu 16.04:
systemctl hibernate
se prefiere sobrepm-hibernate
.Entonces, aquí está el script que uso:
Las variables de entorno necesarias para
notify-send
trabajar se crean con este script :Este archivo debe ejecutarse al inicio (se puede hacer usando cualquier método que elija; uso las aplicaciones de inicio integradas de Ubuntu ).
Nota:
sudo systemctl hibernate
puede que no funcione desde cron. Sigue esto para resolverlo.fuente
Hay muchas formas en que podría implementarse, ya que hay muchos esquemas diferentes de administración de energía implementados dependiendo de lo que haya instalado.
Este sencillo funciona para mí en Debian Jessie minimalista sin ningún entorno de escritorio, solo con un pequeño y rápido administrador de ventanas icewm. (Se recorta porque, de lo contrario, es demasiado lento, y de esta manera supera a GNOME en un hardware mucho mejor)
Específicamente, HE instalado los siguientes paquetes: acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils pero NO tengo NINGUNO de los siguientes (después de haberlos purgado): gnome * kde * systemd * uswsusp upower laptop-mode-tools juego de políticas de hibernación-1
Así que acabo de poner esto
/etc/cron.d/battery_low_check
(todo en una línea, dividido para facilitar la lectura):Es rápido, utiliza pocos recursos y no depende de otros demonios (de hecho, se ignorará si están activos; consulte
/usr/share/acpi-support/policy-funcs
detalles).Lo que hace: cada 5 minutos (
*/5
- puede cambiar a cada minuto con solo usarlo*
si lo necesita para verificar la batería con más frecuencia) sondeará el estado de la batería (" acpi --battery ") y ejecutará el comandoxargs -ri
solo si la batería está " Descargando "(es decir, no está conectado a la CA) y el estado de la batería es inferior a10%
(" int ($ 2) <10 "; siéntase libre de ajustarlo a sus necesidades)acpi_fakekey 205
enviará por defecto elKEY_SUSPEND
evento ACPI (como presionó una tecla en la computadora portátil solicitando la suspensión), que luego hará lo que generalmente 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: comohibernate
(desde el paquete de hibernación)s2disk
os2mem
(desde el paquete uswsusp),pm-suspend-hybrid
(del paquete pm-utils), etc.Por cierto, los números clave mágicos como KEY_SUSPEND = 205 arriba se definen en
/usr/share/acpi-support/key-constants
(otro interesante es probablemente KEY_SLEEP = 142 )fuente
uname
: github.com/jerrinfrncs/batterynotif/blob/master/…Me gusta esta solución, que está parcialmente inspirada en otras respuestas: https://github.com/jerrinfrncs/batterynotif , es decir, el script
batterynotif(uname).sh
.Vea el guión aquí: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Para mi propio uso, he cambiado el script para ingresar al modo de suspensión híbrida en lugar de apagarlo, usando el comando
systemctl hybrid-sleep
. (Esta opción necesita espacio de intercambio).fuente