`systemctl hibernate` 未在 crontab 脚本上执行

`systemctl hibernate` 未在 crontab 脚本上执行

我有一个使用 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正确休眠机器

相关内容