![当存在另一个打开的会话时,哪种机制可以防止关闭?](https://linux22.com/image/1080877/%E5%BD%93%E5%AD%98%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%89%93%E5%BC%80%E7%9A%84%E4%BC%9A%E8%AF%9D%E6%97%B6%EF%BC%8C%E5%93%AA%E7%A7%8D%E6%9C%BA%E5%88%B6%E5%8F%AF%E4%BB%A5%E9%98%B2%E6%AD%A2%E5%85%B3%E9%97%AD%EF%BC%9F.png)
当另一个(GUI)会话打开时,系统拒绝关闭或重新启动。当我选择关闭或者重新开始从系统菜单中。
这是如何实现的?
我并不是在寻求理由(很明显,关闭可能会对其他用户的工作产生不利影响),而是在寻求这种行为背后的机制。
答案1
当您单击关闭按钮时(在 Unity 中):
询问
SessionView
用户SessionManager
是否有权关机。用于检查授权
SessionManager
。systemd-logind
/org/freedesktop/ConsoleKit/Manager
ConsoleKit
设置该属性的主要方式是检查是否有多个用户登录。如果有多个用户登录,则拒绝授权。此外,根据系统的设置方式,ConsoleKit
还可以使用polkit
或基于角色的访问控制来确定授权。如果
SessionView
没有收到用户关机的授权,则将操作模式从 更改shutdown
为logout
。
另外,请注意,此行为(以及如何实现它)是 Ubuntu 做出的决定。我最近将带有 Gnome 3.8 的 Arch 安装在一个分区上,因此在那里登录了两个用户,以查看其中一个用户关闭时会发生什么。有一条消息警告其他用户已登录并可能会丢失工作,但单击“确定”可让关闭继续。
[根据 OP 评论进行编辑]
改变此行为的最简单方法是绕过它。在终端或脚本中,发出:
sudo shutdown -h 0
立即关闭或sudo shutdown -r 0
重新启动。
这假设想要关机的用户具有管理权限,但该用户也可能被授予仅有的管理权限shutdown
。
使用脚本,您可以添加一些细节,例如警告其他登录用户并允许用户改变关机主意。
其他人可能有其他想法(或可能提供详细的脚本来回答新问题),但我想不出任何简单(比如,无需重新编译 Unity 的自定义版本)或超出此解决方案的安全方法。