我想在电量低时休眠:
SUBSYSTEM=="power_supply", \
ATTR{status}=="Discharging", \
ATTR{capacity}=="[0-5]", \
RUN+="/usr/bin/systemctl hibernate", \
如果系统处于唤醒状态,此方法效果很好。但是,如果挂起,它不会休眠,直到我唤醒它,然后它不会让我立即解锁它,而是休眠。
我怎样才能让这个事件在挂起时工作,或者触发唤醒(然后休眠)本身,而无需我打开盖子?
我尝试添加:
ATTR{power/wakeup}="enabled"
没有成功。事实上,wakeup
目前没有/sys/class/power_supply/BAT1/power/
——实际上虽然/sys/class/power_supply/BAT1/device/power/wakeup
存在并且已经存在enabled
。
我认为我无法使 udev 规则在挂起时运行,我需要触发它在低电量时单独唤醒(然后 udev 规则可以运行并休眠)。
这似乎已经实施了drivers/acpi/battery.c
:
/*
* Wakeup the system if battery is critical low
* or lower than the alarm level
*/
if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
(test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
(battery->capacity_now <= battery->alarm)))
acpi_pm_wakeup_event(&battery->device->dev);
但这对我不起作用,我不知道“临界低”是否是另一个文本容量级别,我只看到低至“低”,但当时它低于/sys/class/power_supply/BAT1/alarm
。
注意:我知道hybrid-sleep
,但这不是我想要的,首先因为我想节省一些电池;而且这样我就可以使用suspend-then-hibernate
它在低电量时休眠或者时间延迟。
答案1
事实证明,这实际上是开箱即用的。 (尽管电池支持可能有所不同。)
/sys/class/power_supply/BATn/charge_now
当低于 时,ACPI 驱动程序将从睡眠中唤醒/sys/class/power_supply/BATn/alarm
。
我原来问题中的 udev 规则将能够运行(和休眠)。
然而,这确实意味着您可能希望确保 中的值alarm
(作为 中的百分比charge_full
)与 udev 规则中给出的范围的上限相同或仅略高于该上限。