我使用的是 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。PowerOff
Hibernate
HybridSleep
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% 时,系统就会暂停。
当然,您可以随意将最后一个替换suspend
为hybrid-sleep
、hibernate
或poweroff
任何适合您需要的内容。
不需要外部工具,甚至不需要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_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)