我以前以为单击 GUI 重启按钮会以同样的方式调用 /sbin/reboot sudo reboot
。但是,我现在意识到 CLI 重启需要 sudo,而 GUI 重启则不需要。在 GUI 中重启与在 中重启有什么区别吗sudo reboot
?
我知道有 GUI shell 和 CLI shell,它们都会调用内核。是否可以跟踪 GUI 任务运行的可执行文件?在这种情况下,有没有办法找出单击重新启动按钮时调用的可执行文件?
答案1
是否可以跟踪 GUI 任务运行的可执行文件?在这种情况下,有没有办法找出单击重新启动按钮时调用的可执行文件?
没有。并非所有操作都通过启动可执行文件来完成。(事实上,该可执行文件如何本身执行操作?)在 GNOME 或 KDE 中,“关机”按钮会向系统服务发送 IPC 消息 - 这可能是转载使用 CLI 工具,但不单独使用 CLI 工具。
要监控 D-Bus IPC 调用,请使用busctl monitor
或dbus-monitor
带上“--system”选项,要通过 CLI 自己复制操作,请使用busctl call
或gdbus call
(或不太方便的dbus-send
)。还有一个名为 D-Feet 的图形浏览器可用。
您可以使用“strace”跟踪程序的内核级操作 - 包括文件访问、IPC、网络等。例如,它strace -f -e execve -p $PID
会向您显示该特定进程正在调用哪些可执行文件。
我知道有一个 GUI shell 和一个 CLI shell,它们都会调用内核。
它们都没有真正要求内核重新启动——这始终是一项特权操作,因为它不会干净地停止任何程序或服务;它最多只会在“拔掉插头”之前刷新未写入的文件。
相反,所有关机或重启请求都会发送到“init”系统(大多数情况下是 systemd,以前是 upstart 或 sysvinit)。传统上,该reboot
命令通过 /dev/initctl 套接字发送消息,但使用 systemd 或 upstart 时,它使用 D-Bus。
init 仅在所有服务关闭和文件系统卸载后要求内核重新启动作为最后一步。
在 GUI 中重新启动和使用 sudo reboot 有什么区别?
CLI 命令直接与“init”对话,这通常要求调用者是 root。
相反,GUI 按钮使用 D-Bus IPC 向“logind”服务(或之前的 ConsoleKit)发送一条消息,然后该服务要求“init”执行干净重启。
不同之处在于 logind 或 CK 本身允许任何用户发出重启请求,只要他们有一个活动的本地会话,即他们是当前使用键盘和显示器的人。(这个想法是本地用户无论如何都可以按下物理电源按钮。)
“systemd” init 系统实际上带有systemctl restart
命令,允许以与 GUI 相同的方式进行非特权重启 - 通过调用 logind。(对于 ConsoleKit,这需要使用“gdbus”等进行脚本编写。)
请注意,尽管 logind 以与“reboot”命令相同的方式启动重启,但实际上它并没有跑步命令;它直接使用IPC系统。