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
. ~/.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 haben die Idee und können es leicht an Ihre Bedürfnisse anpassen. Der Pfad zum Akkuladestand kann auf Ihrem System unterschiedlich sein. Etwas portabler wäre es wahrscheinlich, etwas acpi | cut -f2 -d,
zu verwenden, um den Akkuladestand zu ermitteln. 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 Destop-Umgebungen verfügen über Power-Management-Daemons, die den Computer ausschalten. Aber ich gehe davon aus, dass Sie sie absichtlich nicht verwenden und nach einer minimalistischeren Lösung suchen.
sleepd -b 40
und nach der 40% -Marke ist nichts passiert. Ich habe es auch versuchtsudo sleepd -b 40 -s pm-suspend
und nichts passiert ...cut
".) Das Skript funktioniert! Ich habeacpi | cut -f2 -d, | cut -f1 d%
- ich werde über cron lesen, damit es von alleine läuft. Vielen Dank!/sys/devices/platform/smapi/
Verzeichnis. Wo finde ich den verbleibenden Prozentsatz der Batterieleistung? Ich benutze benutzerdefinierten Kernel 3.10/sys/class/power_supply/BAT0/capacity
. Verwenden Sie andernfalls denacpi
Befehl.Anstatt Ihre eigenen Skripte zu hacken und wenn Sie Ubuntu verwenden, wie es das Tag vorschlägt, können Sie einfach das Paket upower installieren. Es sollte auf allen Debian-Derivaten einschließlich Ubuntu verfügbar sein. Standardmäßig wird eine Konfiguration mitgeliefert, bei der
/etc/UPower/UPower.conf
der Hybridschlaf aktiviert wird, sobald der Akkuladestand kritische Werte erreicht. Die Standardeinstellung für das kritische Niveau ist 2%.Für Benutzer anderer Distributionen sind folgende Einträge relevant
/etc/UPower/UPower.conf
:Sie können auch
TimeAction
zusammen mit verwendenUsePercentageForPolicy=false
, um die Aktion auszuführen, sobald nur noch die angegebene Zeit übrig ist:Die gültigen Werte für
CriticalPowerAction
sindPowerOff
,Hibernate
undHybridSleep
. Wenn HybridSleep eingestellt, aber nicht verfügbar ist, wird der Ruhezustand verwendet. Wenn der Ruhezustand aktiviert, aber nicht verfügbar ist, wird PowerOff verwendet.Der Vorteil von HybridSleep ist, dass das System nicht nur in den Swap-Bereich geschrieben, sondern auch angehalten wird. Der Energiesparmodus verbraucht immer noch einen Teil des Akkus. Wenn Sie jedoch vor dem Ende des Akkus zurückkehren, können Sie den Energiesparmodus von einem gesperrten System aus viel schneller fortsetzen als von einem in den Ruhezustand versetzten. Sollte der Akku leer sein, bevor Sie wieder an eine Steckdose angeschlossen werden, können Sie den Ruhezustand des Systems wiederherstellen, sobald Sie wieder mit Strom versorgt werden.
quelle
HybridSleep
, muss ein Swap Space haben.Die aktuell akzeptierte Antwort ist großartig, aber für Ubuntu 16.04 etwas veraltet:
systemctl hibernate
wird vorgezogenpm-hibernate
.Also, hier ist das Skript, das ich benutze:
Die für
notify-send
die Arbeit erforderlichen Umgebungsvariablen werden mit diesem Skript erstellt :Diese Datei muss beim Start ausgeführt werden (kann mit einer beliebigen Methode Ihrer Wahl ausgeführt werden; ich verwende Ubuntus integrierte Startup-Anwendungen ).
Hinweis: Funktioniert
sudo systemctl hibernate
möglicherweise nicht mit cron. Befolgen Sie diese Schritte , um das Problem zu lösen.quelle
Es gibt viele Möglichkeiten, dies zu implementieren, da abhängig von Ihrer Installation viele verschiedene Energieverwaltungsschemata implementiert werden.
Dieser einfache funktioniert für mich auf minimalistischem Debian Jessie ohne Desktop-Umgebung, nur mit kleinem und schnellem icewm-Fenstermanager. (Es wird gekürzt, weil es sonst einfach zu langsam ist und auf diese Weise GNOME auf viel besserer Hardware übertrifft.)
Konkret habe ich folgende Pakete installiert: acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils, aber KEINE der folgenden (nachdem ich sie gelöscht habe): gnome * kde * systemd * uswsusp upower laptop-mode-tools Ruhezustand Policykit-1
Also habe ich dies einfach eingegeben
/etc/cron.d/battery_low_check
(alles in einer Zeile, zur besseren Lesbarkeit aufgeteilt):Es ist schnell, ressourcenschonend und hängt nicht von anderen Deamons ab (wenn tatsächlich, wird es ignoriert, wenn sie aktiv sind - siehe
/usr/share/acpi-support/policy-funcs
für Details).Was es tut: Alle 5 Minuten (
*/5
- Sie können zu jeder Minute wechseln, indem Sie nur verwenden,*
wenn Sie die Batterie öfter prüfen müssen), wird der Batteriestatus abgefragt (" acpi --battery ") und der Befehlxargs -ri
erst ausgeführt, wenn die Batterie leer ist. Entladen "(das heißt, Sie sind nicht an das Stromnetz angeschlossen) und der Batteriestatus ist geringer als10%
(" int ($ 2) <10 "- Sie können ihn jederzeit an Ihre Bedürfnisse anpassen)acpi_fakekey 205
Sendet standardmäßig einKEY_SUSPEND
ACPI-Ereignis (wie Sie eine Taste auf dem Laptop gedrückt haben, um das Anhalten anzufordern), das dann das tut, was es normalerweise für Sie tut (konfiguriert in/etc/default/acpi-support
) - für mich wird es auf der Festplatte in den Ruhezustand versetzt.Sie können stattdessen
acpi_fakekey 205
natürlich auch einen anderen Befehl verwenden : wiehibernate
(aus dem Ruhezustandspaket)s2disk
oders2mem
(aus dem uswsusp-Paket),pm-suspend-hybrid
(aus dem pm-utils-Paket) usw.Übrigens sind magische Schlüsselnummern wie oben KEY_SUSPEND = 205 definiert
/usr/share/acpi-support/key-constants
(eine andere interessante ist wahrscheinlich KEY_SLEEP = 142 ).quelle
uname
Ich mag diese Lösung, die teilweise von anderen Antworten inspiriert ist: https://github.com/jerrinfrncs/batterynotif , nämlich das Skript
batterynotif(uname).sh
.Das Skript finden Sie hier: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Für meinen eigenen Gebrauch habe ich das Skript so geändert, dass mit dem Befehl "Hybrid-Sleep" anstelle von "Shutdown" eingegeben wird
systemctl hybrid-sleep
. (Swap Space wird für diese Option benötigt.)quelle