我有一个使用 acpi 验证电池电量的脚本,如果它低于某个阈值,它应该锁定机器并休眠。使用 crontab 每分钟执行该脚本
问题是机器被锁定但从未休眠。
剧本:
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
read -r status capacity
if [ "$status" = Discharging -a "$capacity" -lt 10 ]; then
echo 'Success' >> /tmp/low;
logger "Critical battery threshold";
DISPLAY=:0 i3lock -t -i $(ls -d ~/.wallpapers/* | shuf | head -n 1);
echo 'Locked' >> /tmp/low;
systemctl hibernate;
fi
}
日志/tmp/low
文件显示以下内容:
$ cat /tmp/low
Success
Locked
Success
Locked
Success
Locked
我尝试直接运行类似的脚本(没有 ACPI 检查)并且它运行得很好
测试脚本:
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
read -r status capacity
echo 'Success' >> /tmp/low;
logger "Critical battery threshold";
DISPLAY=:0 i3lock -t -i $(ls -d ~/.wallpapers/* | shuf | head -n 1);
echo 'Locked' >> /tmp/low;
systemctl hibernate;
}
使用运行相同的测试脚本at
,但它没有使机器休眠。任何想法为什么 crontab 无法执行systemctl hibernate
?
答案1
我找到了解决办法。显然问题出在polkit
定义用户关闭、重新启动、挂起、休眠等策略的包中
由于我默认没有规则文件,/etc/polkit-1/rules.d
因此不允许用户在用户登录时休眠或挂起计算机(我相信这里的问题是我在休眠之前锁定了计算机,因此有一个打开的会话)
/etc/polkit-1/rules.d/99-allow-hibernate-on-low-battery.rules
为了解决这个问题,我必须创建包含以下内容的文件:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.login1.suspend" ||
action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
action.id == "org.freedesktop.login1.hibernate" ||
action.id == "org.freedesktop.login1.hibernate-multiple-sessions") {
return polkit.Result.YES;
}
});
之后,cron
可以at
正确休眠机器