我想使用以下方式暂停我的笔记本电脑at
:
echo "systemctl suspend" | at now + 5 minutes
没有发生暂停,而是我找到了一封来自at
以下位置的邮件/var/spool/mail/me
:
Failed to set wall message, ignoring: Interactive authentication required.
Failed to suspend system via logind: Interactive authentication required.
Failed to start suspend.target: Interactive authentication required.
See system logs and 'systemctl status suspend.target' for details.
好的,运行logind
时需要身份验证。这很有趣,因为当我直接运行时,没有,不需要身份验证并且机器进入暂停状态。at
systemctl suspend
systemctl suspend
at
我已确保使用 执行的命令at
由与直接使用 运行的命令相同的非 root 用户运行echo "echo $(who) > who.txt" | at now
。
怀疑需要身份验证,因为它通过(这是 bash 的别名)at
运行命令,我在启动后执行: 挂起立即发生,无需身份验证,表明嵌套 shell 不是挂起失败的原因。/bin/sh
systemctl suspend
/bin/sh
at
echo "reboot" | at now
在执行和时,我收到相同的行为和非常相似的邮件echo "shutdown now" | at now
。
我的问题是:如何logind
确定它at
试图挂起、重新启动或关闭机器,以及如何判断logind
它应该允许at
在未经身份验证的情况下执行这些命令?
我使用的是 Arch Linux 4.18.1,at
版本为 3.1.19。
答案1
大概运行的命令at
是在不同的环境中,无法访问您的 tty 设备和 dbus 设置等。
Systemd 有自己的at
命令版本。您可以使用它在似乎可以执行其他 systemd 命令的环境中运行命令。因此使用等效命令:
systemd-run --user --on-active=5min /bin/systemctl suspend
为了完美准确地实现 5 分钟的等待时间,您需要添加选项--timer-property=AccuracySec=1
。