![当没有用户登录(没有 X11 会话)时,在哪里获取空闲时间计数器?](https://linux22.com/image/943993/%E5%BD%93%E6%B2%A1%E6%9C%89%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%EF%BC%88%E6%B2%A1%E6%9C%89%20X11%20%E4%BC%9A%E8%AF%9D%EF%BC%89%E6%97%B6%EF%BC%8C%E5%9C%A8%E5%93%AA%E9%87%8C%E8%8E%B7%E5%8F%96%E7%A9%BA%E9%97%B2%E6%97%B6%E9%97%B4%E8%AE%A1%E6%95%B0%E5%99%A8%EF%BC%9F.png)
这种情况发生在 PC 刚刚启动时,或所有用户从其 GUI 会话中注销时。
背景:我正在开发(另一个)灯亮网当满足某些条件时(例如存在来自给定 IP 的网络连接),脚本会阻止空闲/睡眠模式。如果 X11 会话可用,则 - 不会出现问题:
- 我从活动会话的 DBUS 中的 org.gnome.Mutter.IdleMonitor.GetIdletime 中获取空闲计数器,
- 将其与配置的超时时间进行比较
gsettings get org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout
- 并在计数器达到超时值之前的最后一秒安排执行 lightson 检查:
loopDelay=$(( acTimeout - idleCounter - 1 ))
。 - 如果检查返回真,那么我设置抑制剂:
systemd-inhibit --what=sleep ...
。
它可以工作。但只有当有人登录到 X 会话时才有效。当PC 刚刚启动,无人登录, 然后:
- Mutter 接口不可用在 DBUS 中(至少我找不到它)。
- PC 成功(神奇!)在 sleep-inactive-ac-timeout 定义的时间内进入睡眠状态,使用 gsettings
gdm
用户。所以系统肯定使用了一些空闲计数器。我希望它在 DBUS 的某个地方暴露出来。至少,知道这一点是件好事在这个场景中哪个进程负责空闲计数器。
我发现有些进程在gdm
用户下运行,例如 gnome-session-binary、gsd-power、gnome-shell。因此搜索了gdm
用户的 dbus,但 Mutter 在那里不可用:
$ sudo -u gdm bash <<< "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/125/bus; \
gdbus call --session --dest org.gnome.Mutter.IdleMonitor \
--object-path /org/gnome/Mutter/IdleMonitor/Core \
--method org.gnome.Mutter.IdleMonitor.GetIdletime"
Error: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.Mutter.IdleMonitor was not provided by any .service files
替代方法:监控并捕获 systemd/logind 链中的某些 PrepareForSleep 信号,然后执行检查。但我想设置抑制剂已经太晚了 - 系统无论如何都会进入睡眠状态。必须进行调查。
该问题与最近的 Ubuntu 20.04 发行版有关,或者与基于 systemd、logind、Gnome 3 的类似发行版有关……使用过时的电源管理架构的旧系统超出了范围。