从 cron 休眠

从 cron 休眠

我尝试使用命令从 cron 进入休眠状态systemctl hibernate。但是,我收到以下错误:

Failed to set wall message, ignoring: Interactive authentication required.
Failed to hibernate system via logind: Interactive authentication required.
Failed to start hibernate.target: Interactive authentication required.
See system logs and 'systemctl status hibernate.target' for details.

如果我从终端手动执行上述命令,它会按预期工作。

我如何从 cron 中休眠?

我正在使用 Ubuntu 16.04。

答案1

发生这种情况是因为它需要 root 权限。解决方案是使用而不是
添加 hibernate 命令。sudo crontab -e -u rootcrontab -e

波尔基特是非特权用户进行电源管理所必需的。如果您处于本地 systemd-logind 用户会话中,并且没有其他活动会话,则以下命令无需 root 权限即可运行。如果不是(例如,因为另一个用户登录到 tty),systemd 将自动要求您输入 root 密码。

电源管理命令:

systemctl reboot|poweroff|suspend|hibernate|hybrid-sleep

参考https://wiki.archlinux.org/index.php/Systemd#Power_management

答案2

另一个答案很棒!但是它需要 root cron。

如果您想从非 sudo cron 休眠,有 2 个选项:

1. 使用波尔基特

创建一个包含以下内容的文件:

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes 

com.0.enable-hibernation-from-cron.pkla目录中命名的/etc/polkit-1/localauthority/50-local.d/

给出解释这里

2. 使用维苏多

引自这里

如果只允许用户使用关机命令,但不允许用户拥有其他 sudo 权限,则以 root 身份将以下内容添加到 /etc/sudoers使用visudo命令。

user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

替换user您的用户名和hostname机器的主机名。
现在您的用户可以使用 关闭sudo systemctl poweroff,并使用 重新启动sudo systemctl reboot。希望关闭系统的用户也可以使用sudo systemctl halt
仅当您不想提示输入密码时才使用 NOPASSWD: 标记。

就我而言,确切的一行是:

anmol ALL=NOPASSWD: /bin/systemctl hibernate  

(请注意,您的系统上的位置systemctl可能有所不同。)

此后,您可以sudo systemctl hibernate从 cron 写入到 hibernate。

注意:直接修改/etc/sudoers坏的;而是在/etc/sudoers.d/使用命令 - sudo visudo -f /etc/sudoers.d/custom

答案3

在 Debian SID 中,这对我有用:

  1. /etc/polkit-1/rules.d/cron-suspend.rules文件中添加:

    polkit.addRule(function(action, subject) {
         if (subject.user == "my-user" && (action.id == "org.freedesktop.login1.suspend" || action.id == "org.freedesktop.login1.suspend-multiple-session")) {
             return polkit.Result.YES;
         }
    });
    
  2. 重启服务:

    systemctl restart polkit
    

OBS:如果需要,更改suspend为。hibernate

相关内容