很长一段时间以来,我一直在努力反对这一点。这与这个问题。我想知道当我选择从 GUI 关闭我的 Linux 机器时到底会发生什么。这似乎没有很好的记录(如果有的话)。
理想情况下,我希望得到一个与 DE 和操作系统无关的答案。除此之外,我对 Mandriva 2010.1 和 Debian 6.x (Squeeze) 和 7.0 (Wheezy) 都运行 Gnome 的具体情况感兴趣。 (如果您仔细观察,是的,那就是 Gnome 2 和 Gnome 3)
基本上,我想知道当我按“关闭”或“重新启动”时启动哪个命令/脚本/脚本序列,以便我可以修改它们的行为。我看过的一些论坛帖子建议进行黑客攻击/etc/polkit-1/*
,但这个目录结构只是我的 Debian (Squeeze) 盒子上的一个骨架。
有人可以帮忙吗?
编辑
到目前为止我已经尝试过的
shutdown
用我自己的脚本替换了可执行文件。这不起作用:当我按shutdown
Gnome 时,会注销而不执行我的脚本。- 尝试编辑 Gnome 2 菜单。不高兴:“关机”、“注销”和“锁定屏幕”选项不会出现在菜单编辑器中。
- 看了一下
/usr/share/menu
,没有什么帮助。
解决问题的可能途径
strace
GUI 选项(这可能吗?)- 查看 的
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 中选择“关机”或“关闭电源”时触发的机制相同。
有人能证实/反驳吗?是否有可能以某种方式拦截或修改该信号?
答案1
这取决于您的显示管理器! (即KDM、GDM)
请记住您的 DM 以 root 身份运行! (它需要 root 权限才能以您登录的用户身份运行会话进程)
当您在 KDE 或 GNOME 中单击关机时,DE 会在会话终止后向 DM 发送信号以关闭或重新启动。然后,DE 会通知每个程序结束,一旦所有其他进程都终止(或超时),DE 的最后一个进程(即会话进程)就会终止。
会话进程是 X11 会话中启动的第一个进程。当它被终止或终止时,会话就会终止。你在没有 DE 的情况下运行 X 时见过 xterm 吗?这就是一个会话过程。这个过程kdeinit
在 KDE 和GNOME 中被调用gnome-session
。
一旦会话终止,控制权就会返回给您的 DM(它一直在等待 X 进程结束),并检查 DE 告诉他做什么。如果它告诉它关闭电源或重新启动,它就会这样做。在其他情况下,它只会在 X 中启动一个新的登录屏幕。
这也与您过去可能遇到的问题有关,有些DE与其他一些DM结合使用时无法关闭或重新启动,只能注销。
无论如何,这并没有那么糟糕的记录。 GDM 有一个命令的手册页“gdm-control(1)”,它允许您告诉它关闭,就像我之前告诉的那样(gdm-control
)。 KDM 有优秀的文档也有一个类似(稍微复杂一点)的实用程序,名为kdmctl
.
没有PolicyKit也可以关闭和重新启动,但PolicyKit可以满足当今系统所需的许多用途,例如无需root、挂起或休眠计算机即可安装磁盘。而且这也没有不好的记录!
如果您想了解更多有关什么是 PolicyKit 及其工作原理的信息,请查看此内容:http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html