当笔记本电脑的电池电量达到某个低阈值时,如何让笔记本电脑进入睡眠状态?

当笔记本电脑的电池电量达到某个低阈值时,如何让笔记本电脑进入睡眠状态?

我使用的是 Ubuntu,但我使用 i3 作为窗口管理器而不是桌面环境。

当我的电池电量达到 0% 时,计算机会突然关闭,没有任何警告或任何其他信息。

是否有一个简单的脚本或配置可以设置,以便它在电量为 4% 时进入睡眠状态?

答案1

这是一个小脚本,用于检查电池电量并调用自定义命令,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
  source ~/.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 安排每分钟运行一次。编辑你的 crontabcrontab -e并添加脚本:

*/1 * * * * /home/me/usr/bin/low-battery-shutdown

另一种解决方案是安装 Gnome 或 Xfce 等桌面环境(并将窗口管理器更改为 i3)。两个提到的 destop 环境都具有电源管理守护进程,负责关闭计算机电源。但我假设您故意不使用它们,并且正在寻求更简约的解决方案。

答案2

如果您按照标签所示使用 Ubuntu,则无需破解自己的脚本,只需安装 upower 软件包即可。它应该可以在包括 Ubuntu 在内的所有 Debian 衍生版本上使用。默认情况下,它配备了一种配置,/etc/UPower/UPower.conf一旦电池电量达到临界值,就会激活混合睡眠。临界水平的默认值为 2%。

对于其他发行版的用户,相关条目为/etc/UPower/UPower.conf

PercentageAction=2
CriticalPowerAction=HybridSleep

您还可以TimeAction与 一起使用UsePercentageForPolicy=false,让操作在仅剩指定时间时执行:

TimeAction=120

的有效值为、CriticalPowerAction和。如果 HybridSleep 设置但不可用,则将使用 Hibernate。如果设置了休眠但不可用,则将使用 PowerOff。PowerOffHibernateHybridSleep

HybridSleep 的优点是,除了将内存写入交换区域之外,它还会挂起系统。挂起仍会消耗一些电池,但如果您在电池电量耗尽之前返回,则可以比从休眠系统更快地从挂起系统恢复。如果在您返回电源插座之前电池电量耗尽,您可以在再次通电后将系统从休眠状态恢复。

答案3

从 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% 时,系统就会暂停。

当然,您可以随意将最后一个替换suspendhybrid-sleephibernatepoweroff任何适合您需要的内容。

不需要外部工具,甚至不需要acpi包。这是基于 Matija Nalis 答案的想法,但调整为 2023 年。

答案4

实现它的方法有很多种,因为根据您安装的内容,可以实现许多不同的电源管理方案。

这个简单的程序适合我在简约的 Debian Jessie 上运行,无需任何桌面环境,只需使用小而快速的icewm 窗口管理器。 (它被削减了,因为否则它太慢了,这样它在更好的硬件上优于 GNOME)

具体来说,我确实安装了以下软件包: acpi acpi-fakekey acpi-支持 acpi-support-base acpid pm-utils 但没有以下任何一项(已清除): gnome* kde* systemd* uswsusp upower 笔记本电脑模式工具 休眠策略包-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——电池") 并xargs -ri仅当电池处于“放电”状态(即未连接到交流电)并且电池状态小于10%("整数 ($2) < 10“ - 请随意根据您的需要进行调整)

acpi_fakekey 205默认情况下会发送KEY_SUSPENDACPI 事件(就像您在笔记本电脑上按下一个键请求暂停一样),然后它将执行它通常为您执行的任何操作(在 中配置/etc/default/acpi-support) - 对我来说它会休眠到磁盘。

您可以使用其他命令来代替acpi_fakekey 205当然:例如hibernate(来自 hibernate 包),s2disks2mem(来自 uswsusp 包),pm-suspend-hybrid(来自 pm-utils 包)等。

顺便说一句,神奇的关键数字就像KEY_SUSPEND=205上面的定义在/usr/share/acpi-support/key-constants(其他有趣的可能是KEY_SLEEP=142

相关内容