Вот небольшой скрипт, который проверяет уровень заряда батареи и вызывает пользовательскую команду pm-hibernate
, если уровень заряда батареи ниже определенного порога.
#!/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
Это очень простой сценарий, но я думаю, что вы поняли идею и можете легко адаптировать ее к вашим потребностям. Путь к уровню заряда батареи может отличаться в вашей системе. Возможно, немного более портативным было бы использовать что-то вроде acpi | cut -f2 -d,
уровня заряда батареи. Этот сценарий может быть запланирован на запуск cron каждую минуту. Отредактируйте ваш crontab crontab -e
и добавьте скрипт:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Другим решением было бы установить среду рабочего стола, такую как Gnome или Xfce (и изменить ваш оконный менеджер на i3). Обе упомянутые среды destop имеют демонов управления питанием, которые заботятся о выключении компьютера. Но я предполагаю, что вы сознательно не используете их и ищете более минималистичное решение.
sleepd -b 40
и после 40% отметки ничего не произошло. Я тоже пытался,sudo sleepd -b 40 -s pm-suspend
и ничего не происходит ...cut
".) Сценарий работает! У меня естьacpi | cut -f2 -d, | cut -f1 d%
- я прочитаю о cron, чтобы заставить его работать самостоятельно. Благодарность!/sys/devices/platform/smapi/
каталога. Где я могу найти оставшийся процент заряда батареи? Я использую собственное ядро 3.10/sys/class/power_supply/BAT0/capacity
. В противном случае используйтеacpi
команду.Вместо того, чтобы взламывать свои собственные сценарии, и если вы используете Ubuntu, как подсказывает тег, вы можете просто установить пакет upower. Он должен быть доступен на всех производных Debian, включая Ubuntu. По умолчанию он поставляется с конфигурацией, в
/etc/UPower/UPower.conf
которой активируется гибридный режим ожидания, когда уровень заряда батареи достигает критических значений. Значение по умолчанию для критического уровня составляет 2%.Для пользователей других дистрибутивов соответствующие записи для
/etc/UPower/UPower.conf
:Вы также можете использовать
TimeAction
вместе с,UsePercentageForPolicy=false
чтобы позволить выполнению действия, когда осталось только указанное время:Допустимые значения
CriticalPowerAction
являютсяPowerOff
,Hibernate
иHybridSleep
. Если HybridSleep установлен, но недоступен, будет использоваться Hibernate. Если Hibernate установлен, но недоступен, будет использоваться PowerOff.Преимущество HybridSleep заключается в том, что, помимо записи памяти в область подкачки, она затем приостанавливает работу системы. При приостановке все равно будет расходоваться некоторое количество батареи, но если вы вернетесь до того, как батарея разрядится, вы сможете гораздо быстрее возобновить работу из приостановленной системы, чем из спящего режима. Если батарея разрядится до того, как вы вернетесь к электрической розетке, вы можете вывести систему из режима гибернации, как только снова включите питание.
источник
HybridSleep
требуется место подкачки.В настоящее время принят хороший ответ, но он немного устарел для Ubuntu 16.04:
systemctl hibernate
предпочтительнееpm-hibernate
.Итак, вот скрипт, который я использую:
Переменные среды, необходимые для
notify-send
работы, создаются с помощью этого скрипта :Этот файл должен запускаться при запуске (это можно сделать любым методом по вашему выбору; я использую встроенные приложения запуска Ubuntu ).
Примечание:
sudo systemctl hibernate
может не работать с cron. Следуйте этому, чтобы решить это.источник
Существует много способов его реализации, так как в зависимости от того, что вы установили, реализовано много разных схем управления питанием.
Этот простой работает для меня на минималистичном Debian Jessie без какой-либо рабочей среды, только с небольшим и быстрым оконным менеджером icewm. (Он урезан, потому что в противном случае он слишком медленный, и таким образом он превосходит GNOME на гораздо лучшем оборудовании)
В частности, я установил следующие пакеты: acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils, но НЕТ НИКАКОГО из следующих (очистив их): gnome * kde * systemd * uswsusp upower laptop-mode-tools Hibernate Policykit-1
Так что я просто вставил это
/etc/cron.d/battery_low_check
(все в одну строку, разделить для удобства чтения):Он быстрый, использует мало ресурсов и не зависит от других демонов (если это так, он будет проигнорирован, если они активны - см.
/usr/share/acpi-support/policy-funcs
Подробности).Что он делает: каждые 5 минут (
*/5
- вы можете переключиться на каждую минуту, просто используя,*
если вам нужно, чтобы чаще проверять батарею), он будет опрашивать состояние батареи (« acpi --battery ») и выполнять команду после,xargs -ri
только если батарея заряжена » Разряжается "(то есть вы не подключены к сети переменного тока), и состояние аккумулятора ниже10%
(" int ($ 2) <10 "- не стесняйтесь настроить его в соответствии с вашими потребностями)acpi_fakekey 205
по умолчанию отправитKEY_SUSPEND
событие ACPI (как вы нажали клавишу на ноутбуке, запрашивающем приостановку), которое затем будет делать то, что обычно для вас (настроено в/etc/default/acpi-support
) - для меня оно переводится в режим гибернации на диск.Вместо этого вы можете использовать другую команду
acpi_fakekey 205
: напримерhibernate
(из пакета hibernate)s2disk
илиs2mem
(из пакета uswsusp),pm-suspend-hybrid
(из пакета pm-utils) и т. Д.Кстати, магические номера ключей, такие как KEY_SUSPEND = 205 выше, определены в
/usr/share/acpi-support/key-constants
(другой интересный, вероятно, KEY_SLEEP = 142 )источник
uname
: github.com/jerrinfrncs/batterynotif/blob/master/...Мне нравится это решение, которое частично вдохновлено другими ответами: https://github.com/jerrinfrncs/batterynotif , а именно сценарием
batterynotif(uname).sh
.Смотрите скрипт здесь: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Для собственного использования я изменил сценарий, чтобы ввести гибридный сон вместо выключения с помощью команды
systemctl hybrid-sleep
. (Для этой опции требуется пространство подкачки.)источник