Как я делаю свой сон ноутбука, когда он достигает некоторого порога низкого уровня заряда?

Я не совсем уверен в PV, но если Вы используете HVM, у Вас может, конечно, быть другое ядро.

Так или иначе легко попробовать. Завершите работу domU и сделайте копию (или снимок при использовании lvm) образа диска domU. Снова включите его и обновите ядро.

Если что-нибудь не работает, просто возвращается.

24
21.02.2018, 04:24
6 ответов

Вот маленький сценарий, который проверяет на уровень заряда батареи и называет пользовательскую команду, здесь 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 демонов управления питанием функции сред, которые заботятся о выключении компьютера. Но я предполагаю, что Вы сознательно не используете их и ищете более минималистическое решение.

13
27.01.2020, 19:41
  • 1
    Гм, я пытался работать sleepd -b 40 и ничего не произошло после 40%-й метки. Я также попробовал sudo sleepd -b 40 -s pm-suspend и ничего не происходит... Подтвержденный –  o_o_o-- 25.07.2013, 21:45
  • 2
    @NoamGagliardi, он не работает здесь также. Кроме того, пакет кажется несохраняемым. Я пробую, если я могу найти лучшую альтернативу и обновить мой ответ, иначе я удалю его. –  Marco 25.07.2013, 22:18
  • 3
    (СЕЗАМ"cut".) Работы сценария! Я имею acpi | cut -f2 -d, | cut -f1 d% - Я буду читать о кроне, чтобы заставить это работать самостоятельно.Спасибо! –  o_o_o-- 26.07.2013, 01:05
  • 4
    я не имею /sys/devices/platform/smapi/ каталог. Где я могу найти остающийся процент заряда батареи? Я использую пользовательское ядро, 3,10 –  Martin Vegter 16.01.2014, 18:21
  • 5
    @MartinVegter Это зависит от Ваших аппаратных средств, можно попробовать /sys/class/power_supply/BAT0/capacity. Иначе используйте acpi команда. –  Marco 16.01.2014, 21:13

В настоящее время принятый ответ хорош, но немного устарел для Ubuntu 16.04:

  • Команды для получения статуса батареи изменились.
  • Переменные среды, необходимые для работы notify-send , изменены .
  • Приведенный там сценарий больше не работает из пользовательского cron, так как для гибернации требуется root.
  • 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. Следуйте это , чтобы решить эту проблему.

2
27.01.2020, 19:41

Вместо взлома ваших собственных сценариев и если вы используете 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 заключается в том, что он не только записывает память в область подкачки, но и приостанавливает работу системы. Режим ожидания по-прежнему потребляет некоторое количество заряда батареи, но если вы вернетесь до того, как батарея разрядится, вы сможете гораздо быстрее выйти из приостановленной системы, чем из спящего режима. В случае, если батарея разрядится до того, как вы вернетесь к розетке, вы можете вывести систему из спящего режима, как только у вас снова будет электричество.

6
27.01.2020, 19:41

Есть много способов реализации, так как есть много разных схемы управления питанием реализованы в зависимости от того, что у вас установлено.

Этот простой вариант работает для меня на минималистичном 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 )

0
27.01.2020, 19:41

Мне нравится это решение, которое частично вдохновлено другими ответами: https://github.com/jerrinfrncs/batterynotif, а именно скриптом batterynotif(uname).sh.

См. скрипт здесь: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh

Для собственного использования я изменил скрипт для входа в гибридный- спать вместо выключения, используя команду systemctl hybrid-sleep. (Для этой опции требуется пространство подкачки.)

0
27.01.2020, 19:41

Начиная с 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 год.

11
02.04.2020, 16:23

Теги

Похожие вопросы