当没有用户登录(没有 X11 会话)时,在哪里获取空闲时间计数器?

当没有用户登录(没有 X11 会话)时,在哪里获取空闲时间计数器?

这种情况发生在 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 定义的时间内进入睡眠状态,使用 gsettingsgdm用户。所以系统肯定使用了一些空闲计数器。我希望它在 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 的类似发行版有关……使用过时的电源管理架构的旧系统超出了范围。

相关内容