当另一个 (GUI) 会话打开时,系统拒绝关闭或重新启动。当我从系统菜单中选择关闭或重新启动时,它只是将我注销。
这是如何实现的?
我不是在要求理由(很明显,关闭可能会对另一个用户的工作产生不利影响),而是为了这种行为背后的机制。
当您单击关闭按钮时(在 Unity 中):
询问用户SessionView
是否SessionManager
有权关闭。
用于SessionManager
检查授权systemd-logind
。/org/freedesktop/ConsoleKit/Manager
ConsoleKit
本质上是通过检查是否有多个用户登录来设置该属性。如果多个用户登录,则拒绝授权。此外,根据系统的设置方式,ConsoleKit
还可能使用polkit
基于访问控制或基于角色的方式来确定授权。
如果SessionView
未收到用户关闭的授权,则会将操作模式从 更改shutdown
为logout
。
顺便说一句,请注意这种行为(以及如何实现它)是 Ubuntu 做出的决定。我最近将 Arch 和 Gnome 3.8 安装到一个分区,因此登录了两个用户,看看其中一个用户关闭时会发生什么情况。有一条消息警告其他用户已登录并可能会丢失工作,但单击“确定”让关闭继续。
[根据OP评论进行编辑]
更改此行为的最简单方法是绕过它。在终端或脚本中,发出:
sudo shutdown -h 0
用于立即关闭或sudo shutdown -r 0
重新启动。
这假设想要关闭的用户具有管理权限,但也可以仅为该用户授予管理权限shutdown
。
通过脚本,您可以冷添加一些细节,例如警告其他登录用户并允许用户改变关于关闭的想法。
其他人可能有另一个想法(或者可能提供一个充实的脚本来回答新问题),但我想不出除了这个解决方案之外还有什么简单的(比如,无需重新编译自定义版本的 Unity)或安全的东西。