Linux

Linux作業系統如何關閉?

  • December 19, 2018

Gilles 在https://unix.stackexchange.com/a/122667/674上寫了一篇關於 Linux 核心如何關閉的出色回复

我想知道 Linux 作業系統是如何關閉的(在 systemvinit 和 systemd 的情況下)?我期待類似於 Linux 作業系統的啟動順序。我特別想知道程序如何通過 SIGTERM 和 SIGKILL 之類的信號或其他程序間通信方式相互通知?

謝謝。

有關的:

“作業系統關閉時”和“核心關閉時”有什麼區別?

當作業系統關閉時,服務管理器如何知道它應該向其服務發送 SIGTERM 和 SIGKILL?

使用兩者sysvinit和 systemd,關閉作業系統的第一步是通知init程序(pid 為 1 的程序)系統應該關閉(或重新啟動,或關閉電源)。

sysvinit通過使用/run/initctlFIFO 與 進行通信init,要求它切換到相應的執行級別來做到這一點。有關簡要概述,init請參見手冊頁

systemd 支持多種方式來做到這一點。可以使用各種信號來請求關閉、重新啟動等,具有各種風格;也可以通過 d-bus 請求這個(手冊頁解釋busctl如何探索它)。

一旦要求 pid 1 關閉,它就會遵循其配置和規範,並為它執行所有適當的步驟。這通常包括通知所有使用者正在關閉,關閉所有正在執行的服務(以 systemd 的託管方式;使用各種形式的關閉腳本sysvinit),同步已安裝的文件系統,可能解除安裝它們,殺死所有剩餘的程序(使用通常的TERMthenKILL序列),最後reboot使用適當的參數呼叫核心的系統呼叫。

這描述了一般順序。這一切還有更多的曲折,包括訪問控制(使用 Polkit)、各種可用kexec的鉤子、突然斷電處理、Ctrl``Alt``Del處理…… systemd 文件涵蓋了許多這些細節。

引用自:https://unix.stackexchange.com/questions/489703