我目前正在尝试检测用户何时在Linux平台上快速用户切换到另一个用户(具体来说,Fedora 14-16,RedHat 4.7-6.x,CentOS 4-6,OpenSuse 10-11 )。我一直在寻找类似于Windows上可用的WTSRegisterSessionNotification()函数的东西,但我所遇到的只是对Wine软件中的错误的一堆引用。
还有其他人遇到过这个障碍吗?关于如何在Windows和Mac OS X上执行此操作似乎有大量资源(这很好),但在Linux上似乎什么都没有......
编辑: 显然,在较新的系统上(至少Fedora 16)this似乎是一个可行的选择。我想知道它是否有一个DBus接口...更多即将推出!
答案 0 :(得分:1)
首先,我需要告诉你我不是这方面的专家,但我有足够的知识给你指点你可以去的地方并了解更多。所以我在某些方面可能是错的。
我的猜测是:
据我所知(如果在过去的几年中发生了变化,我可能会出错),通过在另一个VT上启动另一个X服务器来实现快速用户切换。因此将检测是否有多个X服务器正在运行。
但是在很多情况下,有多个X服务器正在运行,并且这不是因为快速用户切换。示例:Multiseat甚至简单的Xephyr登录。使用Xephyr和XDMCP,您甚至可以在非快速用户切换的情况下让相同的用户登录两次。
我开始谷歌搜索这个并找到了这个旧网页:
如果从那时起事情没有改变,你应该学习ConsoleKit和PolicyKit(以及今天的DeviceKit和Systemd)以及他们的DBus API。
还有命令ck-list-sessions
和ck-launch-session
。但我相信您可以轻松地欺骗这些命令:尝试ck-launch-session xterm
然后ck-list-session
。
为什么要确切地检测快速用户切换?你的最终目标是什么?也许你可以在不试图检测快速用户切换的情况下解决问题......
答案 1 :(得分:0)
看来获取此信息最有用的方法是使用ConsoleKit DBus interface。
以下过程概述了如何枚举会话并确定它们是否处于活动状态:
1。)使用以下内容枚举会话:
Bus: org.freedesktop.ConsoleKit
Path: /org/freedesktop/ConsoleKit/Manager
Method: org.freedesktop.ConsoleKit.Manager.GetSessions
返回的是导出Session接口的对象路径数组。反过来,可以使用DBus查询这些内容以获取其适当的属性。例如,我使用dbus-send与ConsoleKit进行通信以枚举系统中的会话:
dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.GetSessions
我得到的回报如下:
method return sender=:1.15 -> dest=:1.205 reply_serial=2
array [
object path "/org/freedesktop/ConsoleKit/Session2"
]
2。)使用返回的对象路径,我可以查询它们的属性,例如它们是否处于活动状态,使用以下内容:
Bus: org.freedesktop.ConsoleKit
Path: /org/freedesktop/ConsoleKit/Session2
Method: org.freedesktop.ConsoleKit.Session.IsActive
根据方法,我可以从会话中查询我需要的内容!使用ConsoleKit接口我还可以检索当前会话的标识符,因此我可以随时查询它以查看它是否在我需要时处于活动状态。只是为了好玩,这是以下命令的输出:
dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.IsActive
方法return sender =:1.15 - > dest =:1.206 reply_serial = 2 布尔值
纯
答案 2 :(得分:0)
你必须通过轮询来确保在所有机器上运行(显然你不必让DBus运行来进行用户切换!)。
Solaris,HP-UX和其他人不会在控制台上进行用户切换。
支持的平台:linux,FreeBSD,AIX。 Linux / BSD使用虚拟终端;如果您有兴趣,AIX会使用/dev/lft0
。
假设您希望在控制台上可靠且安全地运行应用程序,并在控制台切换到另一个VT时在新的活动X服务器上重新启动它。问题是您可能会或可能不会运行桌面环境(我们中的一些人使用twm!)。该会话可能尚未通过登录管理器启动(您可以在Linux上执行Ctrl-Alt-F2,登录并非常愉快地运行startx
)。系统甚至可能没有安装xdm / gdm / similar。
愚蠢的解决方案是唯一可靠的解决方案:每隔几秒,查询一下活动虚拟终端(Linux上为VT_GETSTATE
,BSD上为VT_GETACTIVE
)。如果它改变了,你就知道发生了转换。如果您切换到非图形会话(例如使用Ctrl-Alt-F1),则不会激活X服务器。
否则,你必须努力寻找哪个显示号码有效。例如,您可能会在ps
中看到两个X服务器,显示数字为:1和:2。其中哪些是关于VT7的?拼图的最后一部分,将VT数字映射到显示数字,是最难的。这个问题在this duplicate question, "Which virtual terminal is a given X process running on?"中得到了解答。