Linux 操作系统如何关闭?

Tim*_*Tim -3 linux shutdown systemd init

Gilles 在https://unix.stackexchange.com/a/122667/674写了一篇关于 Linux 内核如何关闭的精彩回复

我想知道 Linux 操作系统如何关闭(在 systemvinit 和 systemd 的情况下)?我期待类似于 Linux 操作系统的启动顺序。我特别想知道进程如何通过诸如 SIGTERM 和 SIGKILL 之类的信号或其他一些进程间通信方式相互通知?

谢谢。

有关的:

“操作系统关闭时”和“内核关闭时”有什么区别?

当操作系统关闭时,服务管理器如何知道它应该向其服务发送 SIGTERM 和 SIGKILL?

Ste*_*itt 5

对于sysvinitsystemd 和 systemd,关闭操作系统的init第一步是通知进程(pid 为 1 的进程)系统应该关闭(或重新启动或关闭电源)。

sysvinit这样做是通过使用/run/initctlFIFO 与 进行通信init,要求它切换到相应的运行级别。请参阅init手册页的简要概述。

systemd 支持多种方式来做到这一点。可以使用各种信号以各种方式请求关机、重启等;它也可以请求这种过度d总线(busctl手册页介绍了如何探索)。

一旦要求 pid 1 关闭,它就会遵循其配置和规范,并为其执行所有适当的步骤。这通常包括通知所有用户关闭正在进行中,关闭所有正在运行的服务(以 systemd 的托管方式;使用各种形式的关闭脚本sysvinit),同步已挂载的文件系统,可能卸载它们,终止所有剩余进程(使用通常的TERMthenKILL序列),最后reboot使用适当的参数调用内核的系统调用。

这描述了一般顺序。这一切还有更多的曲折,包括访问控制(使用 Polkit)、各种可用的钩子kexec、突然断电处理、CtrlAltDel处理……systemd 文档涵盖了许多这些细节。