Wie versetze ich meinen Laptop in den Ruhezustand, wenn der Akkustand niedrig ist?

Wie versetze ich meinen Laptop in den Ruhezustand, wenn der Akkustand niedrig ist?

Ich verwende Ubuntu, habe aber i3 als Fenstermanager anstelle einer Desktopumgebung.

Wenn meine Batterie 0 % erreicht, schaltet sich der Computer einfach abrupt ab, ohne Warnung oder ähnliches.

Gibt es ein einfaches Skript oder eine Konfiguration, die ich so einrichten kann, dass es beispielsweise bei 4 % Akkustand in den Ruhezustand wechselt?

Antwort1

Hier ist ein kleines Skript, das den Batteriestand überprüft und einen benutzerdefinierten Befehl aufruft pm-hibernate, falls der Batteriestand 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
  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 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 Batteriestand kann auf Ihrem System anders sein. Etwas portabler wäre es wahrscheinlich, etwas wie zu verwenden, acpi | cut -f2 -d,um den Batteriestand abzurufen. Dieses Skript kann per Cron so geplant werden, dass es jede Minute ausgeführt wird. Bearbeiten Sie Ihre Crontab mit crontab -eund fügen Sie das Skript hinzu:

*/1 * * * * /home/me/usr/bin/low-battery-shutdown

Eine andere Lösung wäre, eine Desktopumgebung wie Gnome oder Xfce zu installieren (und Ihren Fenstermanager auf i3 umzustellen). Beide erwähnten Desktopumgebungen verfügen über Power-Management-Daemons, die sich um das Ausschalten des Computers kümmern. Aber ich gehe davon aus, dass Sie diese absichtlich nicht verwenden und nach einer minimalistischeren Lösung suchen.

Antwort2

Anstatt Ihre eigenen Skripte zu hacken und wenn Sie Ubuntu verwenden, wie der Tag vorschlägt, können Sie einfach das upower-Paket installieren. Es sollte auf allen Debian-Derivaten einschließlich Ubuntu verfügbar sein. Standardmäßig verfügt es über eine Konfiguration, die den /etc/UPower/UPower.confHybrid-Ruhezustand aktiviert, sobald der Akkustand kritische Werte erreicht. Der Standardwert für den kritischen Wert beträgt 2 %.

Für Benutzer anderer Distributionen lauten die relevanten Einträge /etc/UPower/UPower.conf:

PercentageAction=2
CriticalPowerAction=HybridSleep

TimeActionSie können es auch zusammen mit verwenden, UsePercentageForPolicy=falseum die Aktion ausführen zu lassen, sobald nur noch die angegebene Zeit übrig ist:

TimeAction=120

Die gültigen Werte für CriticalPowerActionsind PowerOff, Hibernateund HybridSleep. Wenn HybridSleep festgelegt, aber nicht verfügbar ist, wird Hibernate verwendet. Wenn Hibernate festgelegt, aber nicht verfügbar ist, wird PowerOff verwendet.

Der Vorteil von HybridSleep besteht darin, dass es zusätzlich zum Schreiben von Speicher in Ihren Swap-Bereich das System in den Ruhezustand versetzt. Der Ruhezustand verbraucht zwar immer noch etwas Akku, aber wenn Sie zurückkehren, bevor der Akku leer ist, können Sie das System aus dem Ruhezustand viel schneller wieder aufnehmen als aus dem Ruhezustand. Falls der Akku leer ist, bevor Sie wieder an eine Steckdose kommen, können Sie das System aus dem Ruhezustand wieder aufnehmen, sobald Sie wieder Strom haben.

Antwort3

Ab Debian ≥ 10 (und vergleichsweise neuen Linux-Systemen) können Sie einfach eine Datei erstellen, /etc/cron.d/check-batterydie Folgendes enthält:

* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" != Discharging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 30 ] || systemctl suspend

Dadurch wird Ihr System angehalten, wenn der Batteriestand 30 % erreicht.

Natürlich können Sie das letzte Zeichen suspenddurch hybrid-sleep, hibernate, poweroffoder was auch immer Ihren Anforderungen entspricht ersetzen.

Es sind keine externen Tools erforderlich, nicht einmal das acpiPaket. Dies basiert auf der Idee der Antwort von Matija Nalis, wurde jedoch auf das Jahr 2023 angepasst.

Antwort4

Es gibt viele Möglichkeiten, es umzusetzen, da es, abhängig von Ihrer Installation, viele unterschiedliche Energieverwaltungsschemata gibt.

Dieses einfache Tool funktioniert bei mir auf minimalistischem Debian Jessie ohne Desktop-Umgebung, nur mit dem kleinen und schnellen Fenstermanager icewm. (Es ist abgespeckt, weil es sonst einfach viel zu langsam ist, und auf diese Weise übertrifft es GNOME auf viel besserer Hardware.)

Insbesondere habe ich folgende Pakete installiert: acpi acpi-fakekey acpi-unterstützung acpi-unterstützung-basis acpid pm-utils habe aber KEINES der folgenden (nachdem ich sie gelöscht habe): gnome* kde* systemd* uswsusp upower Laptop-Modus-Tools Ruhezustand Policykit-1

Deshalb habe ich einfach das hier eingefügt /etc/cron.d/battery_low_check(alles in einer Zeile, zur besseren Lesbarkeit aufgeteilt):

*/5 * * * *   root  acpi --battery | 
   awk -F, '/Discharging/ { if (int($2) < 10) print }' | 
   xargs -ri acpi_fakekey 205

Es ist schnell, verbraucht wenig Ressourcen und ist nicht von anderen Daemons abhängig (tatsächlich wird es ignoriert, wenn sie aktiv sind – /usr/share/acpi-support/policy-funcsEinzelheiten finden Sie weiter unten).

Was es macht:alle 5 Minuten ( */5- Sie können auf jede Minute umstellen, indem Sie einfach verwenden, *wenn Sie die Batterie öfter prüfen möchten) wird der Batteriestatus abgefragt ("acpi --battery") und führen Sie den Befehl xargs -rinur aus, wenn die Batterie „entladen“ wird (d. h. Sie sind nicht an das Stromnetz angeschlossen) und der Batteriestatus niedriger ist als 10%(„int ($2) < 10" - passen Sie es gerne Ihren Bedürfnissen an)

acpi_fakekey 205sendet standardmäßig KEY_SUSPENDein ACPI-Ereignis (als ob Sie auf dem Laptop eine Taste gedrückt hätten, um den Ruhezustand anzufordern), das dann das tut, was es normalerweise für Sie tut (konfiguriert in /etc/default/acpi-support) – bei mir wird der Ruhezustand auf der Festplatte durchgeführt.

Sie können stattdessen acpi_fakekey 205natürlich auch andere Befehle verwenden: etwa hibernate(aus dem Hibernate-Paket), s2diskoder s2mem(aus dem uswsusp-Paket), pm-suspend-hybrid(aus dem pm-utils-Paket) usw.

Übrigens, magische Schlüsselzahlen wieKEY_SUSPEND=205oben sind definiert in /usr/share/acpi-support/key-constants(andere interessante ist wahrscheinlichKEY_SLEEP=142)

verwandte Informationen