在 arch/systemd 中关闭盖子时暂停并锁定屏幕

在 arch/systemd 中关闭盖子时暂停并锁定屏幕

锁定屏幕并在合上盖子时暂停的最直接方法是什么?我正在使用事件挂钩/etc/systemd/logind.conf并在关闭盖子时成功挂起。然而,当涉及到锁定部分时,我迷失了 - 我是否应该启用一些屏幕保护程序服务以及如何同时触发两个事件logind.conf

答案1

中有几个例子拱门维基

基本上,它涉及为屏幕锁定器创建一个服务文件并确保它挂接到suspend,hibernatesleep目标。

如果您使用简单的屏幕锁,例如/etc/systemd/system/lock.service看起来像这样:

[Unit]
Description=Lock the screen on resume from suspend

[Service]
User=jason
Environment=DISPLAY=:0
ExecStart=/usr/bin/slock

[Install]
WantedBy=suspend.target

wiki 上的其他示例有更复杂的选项,包括关闭和启动其他服务等。

答案2

虽然 jasonwryan 的答复是正确的,但它并不完整。为了在挂起之后(而不是之前)安全地锁定 - 非 root 进程可能会阻止内核挂起,您必须添加一个之前=强制的实例系统等待执行启动拨电至在暂停之前启动。使用睡眠目标涵盖挂起、休眠和混合睡眠。

[Unit]
 Description=Lock
+Before=sleep.target

 [Service]
 User=mustapha
 Environment=DISPLAY=:0
 ExecStart=/usr/local/bin/slock

 [Install]
-WantedBy=suspend.target
+WantedBy=sleep.target

答案3

如果您使用openrcwith ,elogind是否有替代解决方案(不依赖于 systemd):

#!/bin/sh
#
# /lib/elogind/system-sleep/lock.sh
# Lock before suspend integration with elogind

username=lerax
userhome=/home/$username
export XAUTHORITY="$userhome/.Xauthority"
export DISPLAY=":0.0"

case "${1}" in
        pre)
            su $username -c "/usr/bin/slock" &
            sleep 1s;
            ;;
esac

参考:https://gist.github.com/ryukinix/bd0c1ddcbbafdb4149ae70e41b7c822b

我发布此内容是因为很难找到它的正确工作方式,并且该线程出现在谷歌关于“挂起后锁定”或其他内容的第一个结果中。

答案4

这里提出的所有答案都有一个根本缺陷:它们分别设置 DISPLAY 变量,无论哪个席位/会话处于活动状态。它们涉及编写您自己的 systemd 服务文件。

因此,我建议使用 logind (我相信是 systemd 的一部分)在挂起之前发送 DBUS 通知这一事实。如果您订阅这些消息,您可以从桌面环境中启动屏幕锁定器并真正锁定正确的屏幕/会话。

此外,还有诸如https://github.com/swaywm/swayidle已经实现了这个。例如,我的窗口管理器配置中有这样的内容:

exec swayidle -w \
    timeout 300  'swaylock -i $wallpaper' \
    timeout 600  'swaymsg "output * dpms off"' \
    resume       'swaymsg "output * dpms on"' \
    before-sleep 'swaylock -i $wallpaper' \
    lock         'swaylock -i $wallpaper'

一段时间后、挂起之前以及每当请求屏幕锁定时自动锁定屏幕。我已HandleLidSwitch=lock在 /etc/systemd/logind.conf 中设置为在关闭笔记本电脑时将其锁定。

编辑:您还需要启用 DBUS 支持您的桌面会话。我直接从控制台启动窗口管理器(sway),所以我的电话变成了

exec dbus-run-session sway

同样,您可能(我没有正确测试这部分)启动您的 X 窗口管理器,示例中的 i3 使用以下行~/.xinitrc

exec dbus-launch i3 > /dev/null

编辑:请注意,给出了这个答案很多之后。我不知道在给出这些答案时这是否已经可能,并且不想抹黑任何其他作者。

相关内容