Oto mały skrypt, który sprawdza poziom naładowania baterii i wywołuje tutaj niestandardowe polecenie pm-hibernate
, na wypadek gdyby poziom naładowania baterii był poniżej określonego progu.
#!/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
To bardzo prosty skrypt, ale myślę, że masz pomysł i możesz go łatwo dostosować do swoich potrzeb. Ścieżka do poziomu baterii może być inna w systemie. Nieco bardziej przenośnym byłoby prawdopodobnie użycie czegoś takiego jak acpi | cut -f2 -d,
uzyskanie poziomu naładowania baterii. Skrypt może zostać zaplanowany przez crona tak, aby był uruchamiany co minutę. Edytuj crontab za pomocą crontab -e
i dodaj skrypt:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Innym rozwiązaniem byłoby zainstalowanie środowiska pulpitu, takiego jak Gnome lub Xfce (i zmiana menedżera okien na i3). Oba wspomniane środowiska destop wyposażone są w demony zarządzania energią, które dbają o wyłączenie komputera. Ale zakładam, że celowo ich nie używasz i szukasz bardziej minimalistycznego rozwiązania.
sleepd -b 40
i nic się nie stało po znaku 40%. Też próbowałemsudo sleepd -b 40 -s pm-suspend
i nic się nie dzieje ...cut
”.) Skrypt działa! Mamacpi | cut -f2 -d, | cut -f1 d%
- przeczytam o cronie, żeby sam działał. Dzięki!/sys/devices/platform/smapi/
katalogu Gdzie mogę znaleźć pozostały procent energii baterii? Używam niestandardowego jądra 3.10/sys/class/power_supply/BAT0/capacity
. W przeciwnym razie użyjacpi
polecenia.Zamiast hakować własne skrypty i jeśli używasz Ubuntu, jak sugeruje tag, możesz po prostu zainstalować pakiet upower. Powinien być dostępny na wszystkich pochodnych Debianie, w tym na Ubuntu. Domyślnie jest wyposażony w konfigurację, w
/etc/UPower/UPower.conf
której aktywowany jest tryb uśpienia hybrydowego, gdy poziom naładowania akumulatora osiągnie wartości krytyczne. Domyślny poziom krytyczny to 2%.W przypadku użytkowników innych dystrybucji odpowiednie wpisy
/etc/UPower/UPower.conf
to:Możesz także użyć
TimeAction
razem z,UsePercentageForPolicy=false
aby pozwolić na wykonanie akcji, gdy pozostanie tylko określony czas:Poprawne wartości
CriticalPowerAction
sąPowerOff
,Hibernate
iHybridSleep
. Jeśli HybridSleep jest ustawiony, ale niedostępny, zostanie użyty tryb hibernacji. Jeśli Hibernacja jest ustawiona, ale niedostępna, zostanie użyte PowerOff.Zaletą HybridSleep jest to, że oprócz zapisywania pamięci w obszarze wymiany, zawiesza ona system. Zawieszenie nadal zużywa trochę baterii, ale jeśli wrócisz przed wyczerpaniem się baterii, możesz znacznie szybciej wznowić pracę z zawieszonego systemu niż z hibernowanego. Jeśli bateria wyczerpie się przed powrotem do gniazdka, możesz wznowić działanie systemu ze stanu hibernacji po ponownym włączeniu zasilania.
źródło
HybridSleep
wymaga przestrzeni wymiany.Aktualnie akceptowana odpowiedź jest świetna, ale nieco przestarzała dla Ubuntu 16.04:
systemctl hibernate
jest lepszy niżpm-hibernate
.Więc tutaj jest zastosowanie skryptu I:
Zmienne środowiskowe wymagane
notify-send
do pracy są tworzone za pomocą tego skryptu :Ten plik musi być uruchamiany podczas uruchamiania (można to zrobić dowolną wybraną metodą; używam wbudowanych aplikacji startowych Ubuntu ).
Uwaga:
sudo systemctl hibernate
może nie działać z crona. Postępuj zgodnie z tym, aby go rozwiązać.źródło
Istnieje wiele sposobów jego wdrożenia, ponieważ istnieje wiele różnych schematów zarządzania energią, w zależności od tego, co zainstalowałeś.
Ten prosty działa dla mnie na minimalistycznym Debianie Jessie bez żadnego środowiska graficznego, tylko z małym i szybkim menedżerem okien icewm. (Jest zmniejszany, ponieważ w przeciwnym razie jest po prostu zbyt wolny, i w ten sposób przewyższa GNOME na znacznie lepszym sprzęcie)
W szczególności mam zainstalowanych następujące pakiety: acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils, ale NIE JESTEM z następujących (po ich wyczyszczeniu): gnome * kde * systemd * uswsusp upower laptop-mode-tools hibernacja policykit-1
Więc po prostu wstawiłem to
/etc/cron.d/battery_low_check
(wszystko w jednym wierszu, podzielone dla czytelności):Jest szybki, zużywa niewiele zasobów i nie zależy od innych diamonów (jeśli w rzeczywistości zostaną zignorowane, jeśli będą aktywne - zobacz
/usr/share/acpi-support/policy-funcs
szczegóły).Co robi: co 5 minut (
*/5
- możesz przejść do każdej minuty, używając tylko tego,*
jeśli potrzebujesz częściej sprawdzać baterię), sonduje stan baterii („ acpi - akumulator ”) i wykonuje poleceniexargs -ri
dopiero wtedy, gdy bateria jest „ Rozładowanie ”(to znaczy, że nie masz połączenia z prądem przemiennym), a stan baterii jest mniejszy niż10%
(„ int (2 $) <10 ”- możesz go dostosować do swoich potrzeb)acpi_fakekey 205
domyślnie wyśleKEY_SUSPEND
zdarzenie ACPI (tak jak nacisnąłeś klawisz na laptopie z prośbą o zawieszenie), co zrobi to, co zwykle dla ciebie robi (skonfigurowane w/etc/default/acpi-support
) - dla mnie hibernuje na dysk.Możesz
acpi_fakekey 205
oczywiście użyć innej komendy zamiast : likehibernate
(z pakietu hibernacji)s2disk
lubs2mem
(z pakietu uswsusp),pm-suspend-hybrid
(z pakietu pm-utils) itp.BTW, numery magicznych klawiszy, takie jak KEY_SUSPEND = 205 powyżej są zdefiniowane w
/usr/share/acpi-support/key-constants
(inny interesujący to prawdopodobnie KEY_SLEEP = 142 )źródło
uname
: github.com/jerrinfrncs/batterynotif/blob/master/…Podoba mi się to rozwiązanie, częściowo inspirowane innymi odpowiedziami: https://github.com/jerrinfrncs/batterynotif , a mianowicie skrypt
batterynotif(uname).sh
.Zobacz skrypt tutaj: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Na własny użytek zmieniłem skrypt, aby wchodził w tryb uśpienia hybrydowego zamiast wyłączania za pomocą polecenia
systemctl hybrid-sleep
. (Ta opcja wymaga wymiany przestrzeni).źródło