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

gun*_*ert 5 shutdown

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

这是如何实现的?

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

cha*_*kes 4

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

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

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

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

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

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

[根据OP评论进行编辑]

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

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

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

通过脚本,您可以冷添加一些细节,例如警告其他登录用户并允许用户改变关于关闭的想法。

其他人可能有另一个想法(或者可能提供一个充实的脚本来回答新问题),但我想不出除了这个解决方案之外还有什么简单的(比如,无需重新编译自定义版本的 Unity)或安全的东西。