我目前有一个系统服务设置,可以在每次休眠时锁定我的笔记本电脑,其中/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
实际上,我意识到我的笔记本电脑无法休眠,因为我没有交换分区