当我从GUI中按下“关闭”时会发生什么?


15

我已经为此奋斗了很长时间。这与这个问题有关。我想弄清楚当我选择从GUI关闭我的Linux机器时会发生什么。这似乎没有记录(如果有的话)。

理想情况下,我希望获得与DE和操作系统无关的答案。除非如此,我对Mandriva 2010.1和Debian 6.x(Squeeze)和7.0(Wheezy)都运行Gnome的特定情况感兴趣。(如果您密切关注,是的,那就是Gnome 2和Gnome 3)

基本上,我想知道当我按“ Shut Down”或“ Restart”时启动哪个命令/脚本/脚本序列,以便我可以修改它们的行为。我看过一些论坛帖子建议黑客入侵,/etc/polkit-1/*但是例如,此目录结构只是我的Debian(Squeeze)盒上的骨架。

有人可以帮忙吗?


编辑

到目前为止我尝试过的

  • shutdown用我自己的脚本替换了可执行文件。这是行不通的:当我按shutdownGnome时,将不执行脚本而注销。
  • 尝试编辑Gnome 2菜单。不高兴:菜单编辑器中没有出现“关闭”,“注销”和“锁定屏幕”选项。
  • 看了看/usr/share/menu,那里没有任何帮助。

解决方案的可能途径

  • straceGUI选项(甚至可能吗?)
  • shutdown的源代码
  • gnome-session的源代码

更新资料

根据我对以下答案的评论,我调查了下面的polkit操作,/usr/share/polkit-1/actions/并在文件中找到了org.freedesktop.consolekit.policy一个org.freedesktop.consolekit.system.stop-multiple-users引发消息的调用(在文件中)

System policy prevents stopping the system when other users are logged in

我在想(由于org.freedesktop.*命名约定)这是通过D-BUS发送到DM的某种信号。此外,在尝试以图形方式关闭其他用户登录时显示此消息时,因此触发该消息的机制必须与从GUI中选择“关闭”或“关闭电源”时触发的机制相同。

谁能确认/驳斥?是否有可能以某种方式截获此信号或对其进行修改?


你想达到什么目的?您可以添加一个编辑/etc/init.d/rc.local在停止时调用脚本
2013年

@depquid我要解决的是我链接到的一个较旧的问题:我试图防止本地登录的用户破坏另一个用户的SSH会话。
约瑟夫R.13年

Answers:


9

这取决于您的显示管理器!(即KDM,GDM)

请记住,您的DM以root身份运行!(它需要root特权才能以登录用户的身份运行会话进程)

当您在KDE或GNOME中单击关闭时,您的DE会向DM发送信号,以在会话终止后关闭电源或重新启动。然后,您的DE告诉每个程序结束,并且一旦所有其他进程终止(或超时),则DE的最后一个进程-会话进程-终止。

会话进程是X11会话中启动的第一个进程。当它被杀死或终止时,会话终止。在没有DE的情况下运行X时,您见过xterm吗?那是一个会话过程。kdeinit在KDE和gnome-sessionGNOME中调用此过程。

会话终止后,控制权将返回给您的DM(一直在等待X进程结束),并检查DE告诉他做什么。如果它要求关闭电源或重新启动,它将执行此操作。在其他情况下,它将仅在X中启动一个新的登录屏幕。

这也与您过去可能遇到的问题有关,当某些DE与其他DM结合使用时,它们将无法关机或重新启动,而只能注销。

无论如何,这并不是很糟糕的文档。GDM具有命令的手册页,使您可以像我之前说过(gdm-control)一样告诉它关闭。KDM也有出色的文档,并且有一个名为的类似(稍微有些复杂)的实用程序kdmctl


没有PolicyKit,可以关闭和重新启动,但是PolicyKit可以满足当今系统所需的许多用途,例如无需root,挂起或休眠计算机即可挂载磁盘。而且也没有不良记录!

如果您想进一步了解什么是PolicyKit及其如何工作,请查看以下内容:http ://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html


听起来很有前途。感谢您提供的文档链接。我毫不怀疑这些手册是全面而清晰的,但也可能不存在。您的答案是我第一次看到与此问题相关的显示管理器,因此这并不是完全的常识。我会尝试的,并让您知道...
Joseph R.

好。gdm-control没有帮助。您在PolicyKit上提供的文档似乎更有希望。我将对此进行深入研究,看看是否可以实现自定义规则。待续...
Joseph R.

1
我做了一些阅读(略读,更喜欢),如果我错了,请纠正我:DE,当请求关闭时,将通过D-BUS上的polkit向DM发送消息。等待身份验证,会话可以终止,也可以撤消请求。这在一个定义polkit称为动作org.freedesktop.consolekit.system.stop-multiple-users/usr/share/polkit-1/actions它被设置为撤消不活动的用户和对该请求auth_admin_keep的活动用户。问题是,什么定义了此动作?它究竟执行什么?
约瑟夫·R。

@don_crissti我现在明白了。我感兴趣的正是这个“信号”。发送它的客户端是什么?
Joseph R.

@don_crissti想将此评论移至我的其他问题以进行跟进吗?
约瑟夫·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.