![如何在盖子关闭时运行脚本?](https://linux22.com/image/911200/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%9B%96%E5%AD%90%E5%85%B3%E9%97%AD%E6%97%B6%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我正在尝试配置运行 LUbuntu 18.04 的笔记本电脑,首先进入登录屏幕,然后然后在显示登录屏幕后,暂停。这样做的原因是,默认的简单暂停然后在恢复时显示登录屏幕会导致在恢复时延迟大约 5 秒才显示登录屏幕,而如果在机器暂停时登录屏幕已经启动,则在恢复时几乎可以立即使用。
无论如何,我一直在研究如何做到这一点,而且似乎我最好的选择是在盖子关闭时简单地运行一个脚本,该脚本首先调用,dm-tool lock
然后根据需要延迟等待登录屏幕显示,然后systemctl suspend
。
但是,如何将盖子关闭的动作与运行此脚本联系起来?根据我的研究出现就是acpid
这样。从阅读手册页来看,似乎需要一个/etc/acpi/events
名为的可执行脚本lidbtn
。我的系统上存在该目录,但没有这样的脚本,手册页不清楚它到底需要包含什么。查看此目录中的其他脚本,似乎我需要知道在“event=”行中放什么,但我没有在任何地方找到它。
还提到了窗口管理器处理此事件,但不清楚我需要做什么才能确保我的脚本不会与之冲突。在 Xfce 电源管理器(菜单 -> 首选项 -> 电源管理器)的常规选项卡下,我看到“当笔记本电脑盖关闭时”...暂停,但其他选项只有“关闭显示”和“锁定屏幕”。没有“不执行任何操作”的选项。我需要在这里做什么?请求的操作是在我可能创建的 acpid 脚本执行之前还是之后发生,还是完全覆盖了这一点?
答案1
/etc/acpi/events/laptop-lid
首先,我创建了一个包含以下内容的新文件:
event=button/lid.*
action=/etc/acpi/laptop-lid.sh
然后我创建了/etc/acpi/laptop-lid.sh
包含以下代码:
#!/bin/bash
source $HOME/.Xdbus
grep -q closed /proc/acpi/button/lid/LID/state
if [ $? = 0 ]
then
# close action
dm-tool switch-to-greeter
sleep 5
systemctl suspend
else
# open action
fi
我输入$HOME/.Xdbus
了以下内容:
export XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
并且我使其/etc/acpi/laptop-lid.sh
可执行(chmod a+x
)。
然后我就跑了
/etc/init.d/acpid restart
最后,我进入 XFCE 电源管理器并将其设置为在关闭笔记本电脑盖时“关闭显示”,以避免与我的新改进功能发生冲突。
但是我发现还有一个问题——退出挂起后,会显示登录屏幕,然后机器会再次挂起。经过一番搜索,我认为这是由于漏洞在 Ubuntu 18.04 中,这个问题显然仍然存在。我通过检查自我尝试睡眠 5 秒以来是否已经过去了 6 秒以上来解决这个问题,如果是的话,我不会挂起。看来我的笔记本电脑实际上在 2 秒内就挂起了,所以这对我来说总是有效的。我尝试设置 Xfce 来锁定屏幕,但它似乎也没有遵守这一点——在这两种情况下,我的机器都在 2 秒内挂起了,而我的脚本应该强制它等待至少 5 秒。
更新:
完成所有这些之后,我仍然非常不满意。因为我的 XFCE 电源管理器设置基本上被忽略了,导致机器总是当我合上盖子时,睡眠过程会与 dm-tool 创建欢迎程序的进度之间产生竞争条件,这总是导致一些在该进程完成启动欢迎界面时,恢复时会延迟。因此,我完全撤消了上述所有工作,而是执行以下操作:
编辑~/.config/openbox/lubuntu-rc.xml
。找到锁定屏幕的键绑定,并将其更改为切换到欢迎界面。这样做的主要效果似乎是不是关闭显示屏,这对于让欢迎器立即出现在简历上似乎很重要:
<keybind key='W-L'>
<action name='Execute'>
<command>dm-tool switch-to-greeter</command>
</action>
</keybind>
现在,我不再合上盖子,Win+L而是按下 ,当迎宾员出现时,我然后盖上盖子。
注:我通缉有一个单独的脚本,首先切换到欢迎界面,然后挂起,但似乎无论我如何尝试挂起(systemctl、dbus 等),它们全部拒绝在没有人工干预的情况下从锁定屏幕暂停 - 从对话框中输入密码 - 这是不可能满足的,因为我们在锁定屏幕上!