Arch Linux Systemd 不会检测休眠事件

Arch Linux Systemd 不会检测休眠事件

我目前有一个系统服务设置,可以在每次休眠时锁定我的笔记本电脑,其中/etc/systemd/logind.conf

HandleLidSwitch=hibernate

但由于某种原因我的服务从未运行

这也是我的服务

[Unit]
Description=Lock X session using i3lock
Before=hibernate.target

[Service]
User=user
Environment=DISPLAY=:0
ExecStart=/home/user/scripts/locksleep.sh

[Install]
WantedBy=hibernate.target

该服务也永远不会在系统日志中被调用

答案1

我相信您的单位需要声明它需要在之前运行systemd-hibernate.service,这是实际将系统置于休眠状态的服务。

(我在想,如果您的单元与 并行运行systemd-hibernate.service,那么系统很可能在脚本运行之前进入休眠状态。)

因此,将Before=hibernate.target(您不需要的)替换为Before=systemd-hibernate.service.此外,您需要告诉 systemd 等待脚本执行完成,因此您需要添加Type=oneshot到该[Service]部分。

我假设你的单位也已启用,因为这是 hibernate.target 拉动它所必需的......如果不启用它,没有任何东西会触发它。

所以我猜这足以解决您的设备在休眠之前无法正常运行的问题......

但请注意,有更合适的方法来完成您想要做的事情,即在休眠之前锁定屏幕。

正确的方法是使用抑制剂界面。描述此机制的页面将锁定屏幕列为此界面的用途之一:

屏幕锁定工具希望在挂起之前立即调出屏幕锁定,并延迟挂起直至挂起完成。 

简而言之,您注册一个 D-Bus 客户端并告诉 systemd 您想要在休眠即将发生时收到通知,然后监视PrepareForSleep()来自 D-Bus 的信号,此时您可以锁定屏幕。

理想情况下,这应该由屏幕保护程序本身完成,因此添加支持将是理想的选择。

如果不能使用抑制器接口,那么在挂起之前执行脚本的一种更简单的方法是将脚本放在下面/usr/lib/systemd/system-sleep/,然后检查传递的参数以查看它是否在休眠之前被调用。这应该达到与您尝试从服务单元获得的效果相同的效果,但设置可能要简单得多。

请参阅systemd-hibernate.service 的手册页有关脚本如何system-sleep/工作的更多详细信息。

答案2

实际上,我意识到我的笔记本电脑无法休眠,因为我没有交换分区

相关内容