Ich verwende Ubuntu, aber ich habe i3 als Fenstermanager anstelle einer Desktop-Umgebung.
Wenn mein Akku 0 % erreicht, wird der Computer einfach abrupt heruntergefahren, ohne Warnung oder ähnliches.
Gibt es ein einfaches Skript oder eine Konfiguration, die ich einrichten kann, damit es bei beispielsweise 4 % Akku in den Ruhezustand wechselt?
Akzeptierte Antwort:
Hier ist ein kleines Skript, das den Batteriestand überprüft und einen benutzerdefinierten Befehl aufruft, hier pm-hibernate
, falls der Akkustand unter einem bestimmten Schwellenwert liegt.
#!/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%.nn 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 ist ein sehr einfaches Skript, aber ich denke, Sie verstehen die Idee und können es leicht an Ihre Bedürfnisse anpassen. Der Pfad zum Akkustand kann auf Ihrem System anders sein. Etwas portabler wäre wahrscheinlich etwas wie acpi | cut -f2 -d,
um den Batteriestand zu erhalten. Dieses Skript kann von Cron so geplant werden, dass es jede Minute ausgeführt wird. Bearbeiten Sie Ihre Crontab mit crontab -e
und fügen Sie das Skript hinzu:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Eine andere Lösung wäre, eine Desktop-Umgebung wie Gnome oder Xfce zu installieren (und Ihren Fenstermanager auf i3 zu ändern). Beide genannten Desktop-Umgebungen verfügen über Energieverwaltungs-Daemons, die sich um das Herunterfahren des Computers kümmern. Aber ich nehme an, Sie verwenden sie bewusst nicht und suchen nach einer minimalistischeren Lösung.
Verwandte:Wie kann man Umgebungsvariablen, die in einem Shell-Skript „exportiert“ werden, beibehalten?