当存在另一个打开的会话时,哪种机制可以防止关闭?

当存在另一个打开的会话时,哪种机制可以防止关闭?

当另一个(GUI)会话打开时,系统拒绝关闭或重新启动。当我选择关闭或者重新开始从系统菜单中。

这是如何实现的?

我并不是在寻求理由(很明显,关闭可能会对其他用户的工作产生不利影响),而是在寻求这种行为背后的机制。

答案1

当您单击关闭按钮时(在 Unity 中):

  1. 询问SessionView用户SessionManager是否有权关机。

  2. 用于检查授权SessionManagersystemd-logind/org/freedesktop/ConsoleKit/Manager

  3. ConsoleKit设置该属性的主要方式是检查是否有多个用户登录。如果有多个用户登录,则拒绝授权。此外,根据系统的设置方式,ConsoleKit还可以使用polkit或基于角色的访问控制来确定授权。

  4. 如果SessionView没有收到用户关机的授权,则将操作模式从 更改shutdownlogout

另外,请注意,此行为(以及如何实现它)是 Ubuntu 做出的决定。我最近将带有 Gnome 3.8 的 Arch 安装在一个分区上,因此在那里登录了两个用户,以查看其中一个用户关闭时会发生什么。有一条消息警告其他用户已登录并可能会丢失工作,但单击“确定”可让关闭继续。

[根据 OP 评论进行编辑]

改变此行为的最简单方法是绕过它。在终端或脚本中,发出:

sudo shutdown -h 0立即关闭或sudo shutdown -r 0重新启动。

这假设想要关机的用户具有管理权限,但该用户也可能被授予仅有的管理权限shutdown

使用脚本,您可以添加一些细节,例如警告其他登录用户并允许用户改变关机主意。

其他人可能有其他想法(或可能提供详细的脚本来回答新问题),但我想不出任何简单(比如,无需重新编译 Unity 的自定义版本)或超出此解决方案的安全方法。

相关内容