我在使用 void linux 时遇到了一些问题。我尝试将 slock 作为脚本添加到 zzz:/etc/zzz.d/suspend/slock
#!/bin/sh
slock
它以一种奇怪的方式工作:如果我调用zzz
,它会调出 slock 并且不会挂起,直到我输入密码并解锁。我将脚本移至/etc/zzz.d/resume/slock
,现在在恢复时它会闪烁解锁屏幕一秒钟,然后锁定屏幕,这不是很好,但还可以。
但还有另一个问题:合上盖子会暂停笔记本电脑,但根本不会锁定屏幕。我想这可能与 有关acpid
。当我禁用 时acpid
,合上盖子不会暂停笔记本电脑,因此acpid
肯定要对此负责。我尝试修补/etc/acpi/handler.sh
,现在看起来像这样:
close)
# suspend-to-ram
logger "LID closed, suspending..."
slock
zzz
;;
open) logger "LID opened" ;;
*) logger "ACPI action undefined (LID): $2";;
并且slock
无论如何都不会被执行。我尝试zzz
从 中删除handler.sh
,然后关闭盖子不会执行任何操作,这意味着它实际上zzz
在存在时执行,但zzz
由于某种原因不执行 的用户脚本。我也尝试在两者中替换slock
为(例如 voidi3lock
handler.sh
维基百科建议)zzz.d/resume
但它是相同的。我做错了什么还是有其他原因导致这种行为?
答案1
像这样修补这个问题:
/etc/zzz.d/suspend/01
#!/bin/sh
doas -u ds xsecurelock &
sleep 2
/etc/doas.conf
permit persist :wheel
permit nopass root as ds cmd xsecurelock
permit nopass :wheel as root cmd zzz
permit nopass :wheel as root cmd ZZZ
permit nopass keepenv root as root
您可以尝试在挂起脚本中为root用户定义$DISPLAY,但我太愚蠢了,无法解决这个问题。
答案2
您最初的解决方案不起作用,因为 shell 会等待 slock 进程停止然后再继续。最简单(但不是最好)的解决方案是创建slock &
允许进程继续运行的命令。但是,这并不能保证 slock 在设备挂起之前完成运行。
执行此操作的“正确”方法是使用xss-lock
调用 slock,并使用xset
命令锁定屏幕。这两个都可以在 Void 的存储库中找到。xss-lock slock
将设置 xss-lock 以使用 slock 进行锁定。
这应该无需任何额外的脚本即可工作,因为 xss-lock 应该在正常挂起时起作用。然而,基于挂起的事件始终存在错误,因此通过 xset 进行额外激活并不是一个坏主意。
一个例子/etc/zzz.d/suspend/slock
是
#!/bin/sh
xset s activate
可以将类似的脚本放置在相应的“恢复”文件中,但在锁定屏幕之前出现的解锁屏幕的问题仍然会出现。