Я не совсем уверен в PV, но если Вы используете HVM, у Вас может, конечно, быть другое ядро.
Так или иначе легко попробовать. Завершите работу domU и сделайте копию (или снимок при использовании lvm) образа диска domU. Снова включите его и обновите ядро.
Если что-нибудь не работает, просто возвращается.
Вот маленький сценарий, который проверяет на уровень заряда батареи и называет пользовательскую команду, здесь 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,
получить уровень заряда батареи. Этот сценарий, как может планировать крон, будет работать каждую минуту. Отредактируйте свой crontab с crontab -e
и добавьте сценарий:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Другое решение состояло бы в том, чтобы установить настольную среду как Gnome или Xfce (и изменить Ваш менеджер окон на i3). Оба упомянули destop демонов управления питанием функции сред, которые заботятся о выключении компьютера. Но я предполагаю, что Вы сознательно не используете их и ищете более минималистическое решение.
В настоящее время принятый ответ хорош, но немного устарел для Ubuntu 16.04:
systemctl hibernate
предпочтительнее, чем pm-hibernate
. Итак, здесь - это сценарий, который я использую:
#!/usr/bin/env bash
# Notifies the user if the battery is low.
# Executes some command (like hibernate) on critical battery.
# This script is supposed to be called from a cron job.
# If you change this script's name/path, don't forget to update it in crontab !!
level=$(cat /sys/class/power_supply/BAT1/capacity)
status=$(cat /sys/class/power_supply/BAT1/status)
# Exit if not discharging
if [ "${status}" != "Discharging" ]; then
exit 0
fi
# Source the environment variables required for notify-send to work.
. /home/anmol/.env_vars
low_notif_percentage=20
critical_notif_percentage=15
critical_action_percentage=10
if [ "${level}" -le ${critical_action_percentage} ]; then
# sudo is required when running from cron
sudo systemctl hibernate
exit 0
fi
if [ "${level}" -le ${critical_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-caution.png' "Battery critical: ${level}%"
exit 0
fi
if [ "${level}" -le ${low_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-low.png' "Battery low: $level%"
exit 0
fi
Переменные среды, необходимые для работы notify-send
, создаются с использованием этого сценария :
#!/usr/bin/env bash
# Create a new file containing the values of the environment variables
# required for cron scripts to work.
# This script is supposed to be scheduled to run at startup.
env_vars_path="$HOME/.env_vars"
rm -f "${env_vars_path}"
touch "${env_vars_path}"
chmod 600 "${env_vars_path}"
# Array of the environment variables.
env_vars=("DBUS_SESSION_BUS_ADDRESS" "XAUTHORITY" "DISPLAY")
for env_var in "${env_vars[@]}"
do
echo "$env_var"
env | grep "${env_var}" >> "${env_vars_path}";
echo "export ${env_var}" >> "${env_vars_path}";
done
Этот файл должен запускаться при запуске (можно сделать любым методом по вашему выбору; я использую встроенную в Ubuntu Startup Applications ).
Примечание: sudo systemctl hibernate
может не работать из cron. Следуйте это , чтобы решить эту проблему.
Вместо взлома ваших собственных сценариев и если вы используете Ubuntu, как предлагает тег, вы можете просто установить пакет upower. Он должен быть доступен на всех производных Debian, включая Ubuntu. По умолчанию он поставляется с конфигурацией в /etc/UPower/UPower.conf
, которая активирует гибридный спящий режим, когда уровень заряда батареи достигает критических значений. По умолчанию критический уровень составляет 2%.
Для пользователей других дистрибутивов соответствующие записи для /etc/UPower/UPower.conf
:
PercentageAction=2
CriticalPowerAction=HybridSleep
Вы также можете использовать TimeAction
вместе с UsePercentageForPolicy = false
, чтобы действие могло выполняться только после того, как осталось указанное время:
TimeAction=120
Допустимые значения для CriticalPowerAction
: PowerOff
, Hibernate
и HybridSleep
. Если HybridSleep установлен, но недоступен, будет использоваться Hibernate. Если спящий режим установлен, но недоступен, будет использоваться PowerOff.
Преимущество HybridSleep заключается в том, что он не только записывает память в область подкачки, но и приостанавливает работу системы. Режим ожидания по-прежнему потребляет некоторое количество заряда батареи, но если вы вернетесь до того, как батарея разрядится, вы сможете гораздо быстрее выйти из приостановленной системы, чем из спящего режима. В случае, если батарея разрядится до того, как вы вернетесь к розетке, вы можете вывести систему из спящего режима, как только у вас снова будет электричество.
Есть много способов реализации, так как есть много разных схемы управления питанием реализованы в зависимости от того, что у вас установлено.
Этот простой вариант работает для меня на минималистичном Debian Jessie без какой-либо среды рабочего стола, только с маленьким и быстрым оконным менеджером icewm. (Он урезан, потому что в противном случае он слишком медленный, и таким образом он превосходит GNOME на гораздо лучшем оборудовании)
В частности, я ДЕЙСТВИТЕЛЬНО установил следующие пакеты: acpi acpi-fakekey acpi- поддерживают acpi-support-base acpid pm-utils , но не имеют НИКАКОГО из следующего (после их очистки): gnome * kde * systemd * uswsusp upower laptop-mode- tools hibernate policykit-1
Так что я просто поместил это в /etc/cron.d/battery_low_check
(все в одной строке, разделены для удобства чтения):
*/5 * * * * root acpi --battery |
awk -F, '/Discharging/ { if (int($2) < 10) print }' |
xargs -ri acpi_fakekey 205
Это быстро, мало ресурсов - использования, и не зависит от других демонов (на самом деле, он будет проигнорирован, если они активны - подробности см. в / 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
(из пакета гибернации), s2disk
или s2mem
(из пакета uswsusp), pm-suspend-hybrid
(из пакета pm-utils) и т. д.
Кстати, магические номера ключей, такие как KEY_SUSPEND = 205 выше, определены в ] / usr / share / acpi-support / key-constants
(другой интересный, вероятно, KEY_SLEEP = 142 )
Мне нравится это решение, которое частично вдохновлено другими ответами: https://github.com/jerrinfrncs/batterynotif, а именно скриптом batterynotif(uname).sh
.
См. скрипт здесь: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Для собственного использования я изменил скрипт для входа в гибридный- спать вместо выключения, используя команду systemctl hybrid-sleep
. (Для этой опции требуется пространство подкачки.)
Начиная с Debian ≥ 10 (и более поздних систем Linux ), вы можете просто создать файл /etc/cron.d/check-battery
, содержащий:
* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" != Discharging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 30 ] || systemctl suspend
Система приостанавливает работу всякий раз, когда уровень заряда батареи достигает 30 %.
Конечно, не стесняйтесь заменять окончательный suspend
на hybrid-sleep
, hibernate
, poweroff
или что-то другое, что соответствует вашим потребностям.
Никаких внешних инструментов не требуется, даже пакет acpi
. Это основано на идее ответа Матии Налис, но с поправкой на 2021 год.
sleepd -b 40
и ничего не произошло после 40%-й метки. Я также попробовалsudo sleepd -b 40 -s pm-suspend
и ничего не происходит... Подтвержденный – o_o_o-- 25.07.2013, 21:45cut
".) Работы сценария! Я имеюacpi | cut -f2 -d, | cut -f1 d%
- Я буду читать о кроне, чтобы заставить это работать самостоятельно.Спасибо! – o_o_o-- 26.07.2013, 01:05/sys/devices/platform/smapi/
каталог. Где я могу найти остающийся процент заряда батареи? Я использую пользовательское ядро, 3,10 – Martin Vegter 16.01.2014, 18:21/sys/class/power_supply/BAT0/capacity
. Иначе используйтеacpi
команда. – Marco 16.01.2014, 21:13