【问题标题】:User idle time being reset to 0 after 30 secs on LinuxLinux 上 30 秒后用户空闲时间重置为 0
【发布时间】:2011-06-10 22:04:52
【问题描述】:

我正在尝试使用 X11 屏幕保护程序扩展客户端库检测自上次用户输入以来的时间。我会定期致电XScreenSaverQueryInfo 以获得空闲时间。我面临的问题是,每隔 20-30 秒,此调用报告的空闲时间重置为 0。即使当时没有实际的用户输入,也会发生这种情况。我对此完全感到困惑。我唯一的线索是,如果我卸载gnome-screensaver,问题就会消失。我的问题是,gnome-screensaver 是否出于某种原因模拟用户输入?我知道这听起来不太可能,如果确实如此,那肯定是gnome-screensaver 的错误,但我现在想不出其他任何东西。有谁知道我在哪里可以找到更多关于gnome-screensaver 工作原理以及它如何影响XScreenSaverQueryInfo 调用的信息,而无需实际阅读代码。我浏览了gnome-screensaverhome 的信息,但找不到与我的问题相关的任何信息。

更新:我从 dbus-monitor 得到以下输出。我该如何解释:

method call sender=:1.97538 -> dest=org.gnome.ScreenSaver serial=3 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=SimulateUserActivity

我认为某些进程要求 gnome-screensaver 模拟用户活动。或者,gnome-screensaver 是否向 dbus 发送 SimulateUserActivity 信号?如果是第一个,我怎样才能知道哪个进程要求 gnome-screensaver 这样做?

【问题讨论】:

    标签: linux x11 gnome screensaver idle-timer


    【解决方案1】:

    程序(视频播放器在播放视频时执行此操作)可能正在发送 gnome-screensaver-command --poke 命令,该命令将发送 SimulateUserActivity 事件以重置空闲时间,从而阻止屏幕保护程序激活。

    【讨论】:

    • 我没有运行任何前台进程。有什么方法可以查询哪个应用程序可能正在这样做?
    • 您可以使用 shell 脚本覆盖 gnome-screen-command 程序,该脚本将打印出谁在调用它。当然有人可能只是在使用 DBus 接口。
    • 我已更新我的问题以包含来自 dbus-monitor 的输出。知道这意味着什么吗?
    • 是的,某些程序正在戳屏幕保护程序以阻止它启动。和我猜的一样。
    【解决方案2】:

    一旦你有了 dbus 发件人(如 dbus-monitor 所示),你可以这样做:

    dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetConnectionUnixProcessID string:':1.97538'
    

    插入实际的发件人。这会为您提供发送消息的 pid。

    然后说 pid 是 2144,你会这样做:

    cat /proc/2144/cmdline
    

    作为查看程序是什么的一种方式。

    【讨论】:

    • 我做到了。它说:错误org.freedesktop.DBus.Error.NameHasNoOwner:无法获取名称':1.ddddd'的PID:没有这样的名称这里,1.ddddd是实际的发件人。
    • 指向连接的东西,发送 SimulateUserActivity,然后在您进行调查之前断开连接。也许上面提到的 gnome-screensaver-command --poke 。用 shell 脚本替换 gnome-screensaver-command 的建议很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多