J'utilise Ubuntu, mais j'ai I3 comme responsable de la fenêtre au lieu d'un environnement de bureau.
Lorsque ma batterie atteint 0%, l'ordinateur ne fera que fermer brusquement, aucun avertissement ou quoi que ce soit.
Existe-t-il un script simple ou une configuration que je peux configurer pour qu'il se couche à 4% de batterie?
Voici un petit script qui vérifie le niveau de la batterie et appelle une commande personnalisée, ici pm-hibernate
, si le niveau de la batterie est inférieur à un certain seuil.
#!/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
C'est un script très simple, mais je pense que vous avez l'idée et je peux facilement l'adapter à vos besoins. Le chemin du niveau de la batterie peut être différent sur votre système. Un peu plus portable serait probablement d'utiliser quelque chose comme acpi | cut -f2 -d,
Pour obtenir le niveau de la batterie. Ce script peut être programmé par Cron pour fonctionner chaque minute. Modifiez votre crontab avec crontab -e
et ajouter le script:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Une autre solution serait d'installer un environnement de bureau comme Gnome ou XFCE (et modifier votre gestionnaire de fenêtres vers I3). Les deux environnements de destinés mentionnés comportent des démons de gestion de l'alimentation qui s'occupent d'une mise hors tension de l'ordinateur. Mais je suppose que vous ne les utilisez pas délibérément et je cherche une solution plus minimaliste.
Au lieu de pirater vos propres scripts et si vous utilisez Ubuntu comme le suggère que la balise suggère, vous pouvez simplement installer l'emballage plus utile. Il devrait être disponible sur tous les dérivés debian, y compris Ubuntu. Par défaut, il est livré avec une configuration dans /etc/UPower/UPower.conf
qui active le sommeil hybride une fois que le niveau de la batterie atteint les valeurs critiques. La valeur par défaut du niveau critique est de 2%.
Pour les utilisateurs d'autres distributions, les entrées pertinentes pour /etc/UPower/UPower.conf
sommes:
PercentageAction=2
CriticalPowerAction=HybridSleep
Vous pouvez également utiliser TimeAction
avec UsePercentageForPolicy=false
Pour que l'action soit effectuée une fois que le temps spécifié est laissé:
TimeAction=120
Les valeurs valides pour CriticalPowerAction
sont PowerOff
, Hibernate
et HybridSleep
. Si Hybridsleep est défini mais non disponible, Hibernate sera utilisé. Si Hibernate est défini mais non disponible, PowerOff sera utilisé.
L'avantage de Hybridsleep est que, en plus de l'écriture de la mémoire dans votre zone d'échange, il suspend ensuite le système. La suspension consomme toujours une certaine batterie, mais si vous revenez avant que la batterie ne soit manquée, vous pouvez également reprendre plus rapidement à partir d'un système suspendu que d'un hiberné. Si la batterie est épuisée avant de revenir à une prise d'alimentation, vous pouvez reprendre le système de Hibernation une fois que vous aurez de nouveau le pouvoir.
La réponse actuellement acceptée est excellente, mais un peu obsolète pour Ubuntu 16.04:
systemctl hibernate
est préféré sur pm-hibernate
.Donc, ICI est le script que j'utilise:
#!/usr/bin/env bash
# Notifies the user if the battery is low.
# Executes some command (like hibernate) on critical battery.
# This script is supposed to be called from a cron job.
# If you change this script's name/path, don't forget to update it in crontab !!
level=$(cat /sys/class/power_supply/BAT1/capacity)
status=$(cat /sys/class/power_supply/BAT1/status)
# Exit if not discharging
if [ "${status}" != "Discharging" ]; then
exit 0
fi
# Source the environment variables required for notify-send to work.
. /home/anmol/.env_vars
low_notif_percentage=20
critical_notif_percentage=15
critical_action_percentage=10
if [ "${level}" -le ${critical_action_percentage} ]; then
# Sudo is required when running from cron
Sudo systemctl hibernate
exit 0
fi
if [ "${level}" -le ${critical_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-caution.png' "Battery critical: ${level}%"
exit 0
fi
if [ "${level}" -le ${low_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-low.png' "Battery low: $level%"
exit 0
fi
Les variables d'environnement requises pour notify-send
Pour travailler sont créés à l'aide de ce script :
#!/usr/bin/env bash
# Create a new file containing the values of the environment variables
# required for cron scripts to work.
# This script is supposed to be scheduled to run at startup.
env_vars_path="$HOME/.env_vars"
rm -f "${env_vars_path}"
touch "${env_vars_path}"
chmod 600 "${env_vars_path}"
# Array of the environment variables.
env_vars=("DBUS_SESSION_BUS_ADDRESS" "XAUTHORITY" "DISPLAY")
for env_var in "${env_vars[@]}"
do
echo "$env_var"
env | grep "${env_var}" >> "${env_vars_path}";
echo "export ${env_var}" >> "${env_vars_path}";
done
Ce fichier doit être exécuté au démarrage (peut être effectué en utilisant n'importe quelle méthode de votre choix; J'utilise l'Ubuntu's intitulé applications de démarrage ).
Remarque: Sudo systemctl hibernate
pourrait ne pas fonctionner de cron. Suivez Ceci pour le résoudre.
Il suffit de créer un fichier /etc/cron.d/check-battery
cela contient:
* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" = Charging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 10 ] || systemctl suspend
Cela suspendra votre système chaque fois que le niveau de la batterie atteindra 10%.
Bien sûr, n'hésitez pas à remplacer la finale suspend
avec hybrid-sleep
, hibernate
, poweroff
ou tout ce qui correspond à vos besoins.
Aucun outil externe n'est requis, pas même le package acpi
. Ceci est basé sur l'idée de la réponse de Matija Nalis, mais ajustée à l'année 2020.
J'aime cette solution, qui est partiellement inspirée par d'autres réponses: https://github.com/jerrinfrncs/batterinnotif , à savoir le script batterynotif(uname).sh
.
Voir le script ici: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Pour mon propre usage, j'ai changé le script pour entrer Hybrid-Dormir au lieu d'être arrêté, en utilisant la commande systemctl hybrid-sleep
. (L'espace d'échange est nécessaire par cette option.)
Il existe de nombreuses façons de mettre en œuvre, car de nombreux systèmes de gestion de la puissance sont implémentés en fonction de ce que vous avez installé.
Ce simple fonctionne pour moi sur Debian Jessie minimaliste sans aucun environnement de bureau, juste avec un gestionnaire de fenêtres à glace rapide et rapide. (Il est coupé parce que c'est juste trop lent sinon, et cette façon de surperformer Gnome sur beaucoup de quincaillerie)
Spécifiquement, j'ai installé des packages suivants: ACPI ACPI-FakeKey ACPI-support ACPI-Base ACPI-Base ACPI-UTILS mais n'a rien de ce qui suit (les avoir purgées): GNOME * KDE * Systemd * Uswsusp upower Upower Mode-Mode-Outils Hibernate Policy-1
Donc je viens de mettre cela dans /etc/cron.d/battery_low_check
(Tout en une ligne, divisé pour la lisibilité):
*/5 * * * * root acpi --battery |
awk -F, '/Discharging/ { if (int($2) < 10) print }' |
xargs -ri acpi_fakekey 205
C'est une utilisation rapide, de faible ressources et ne dépend pas d'autres denons (si cela sera ignoré s'il est actif - voir /usr/share/acpi-support/policy-funcs
pour plus de détails).
ce qu'il fait : toutes les 5 minutes (*/5
- Vous pouvez passer à chaque minute en utilisant simplement *
Si vous en avez besoin pour vérifier la batterie plus souvent), il sonder l'état de la batterie (" ACPI -Battery ") et exécuter la commande après xargs -ri
Seulement si la batterie est "déchargée" (c'est-à-dire que vous n'êtes pas connecté à AC) et l'état de la batterie est inférieur à 10%
(" int (2 $) <10 " - N'hésitez pas à l'accorder à vos besoins)
acpi_fakekey 205
volonté par défaut envoyer KEY_SUSPEND
Événement ACPI (comme vous avez appuyé sur une touche sur la suspension de la norme Ordinateur portable), qui fera ensuite tout ce qu'elle fait habituellement pour vous (configuré dans /etc/default/acpi-support
) - Pour moi, il hiberne au disque.
Vous pouvez utiliser une autre commande au lieu de acpi_fakekey 205
Bien sûr: comme hibernate
(de l'emballage hibernate), s2disk
ou s2mem
(du paquet USWSUSP), pm-suspend-hybrid
(à partir du paquet PM-Utils) etc.
BTW, des numéros de clé magiques tels que Key_suspend = 205 ci-dessus sont définis dans /usr/share/acpi-support/key-constants
(autre intéressant est probablement Key_sleep = 142 )