init 行程(PID 1)
/ init, 'ih-NIT'; systemd, 'SYSTEM-dee' /
每棵家譜的最頂端都有一位唯一的開創始祖,他自己沒有父母,其他所有人都從他衍生而來。在類 Unix 系統上,那位始祖就是 init 行程:核心在開機時啟動的第一個行程,被賦予 PID 1,是其他每個行程的祖先,也是那個在通常意義上沒有父行程的行程。
系統開機時,核心先把自己設置好,然後恰好啟動一個使用者行程,也就是 init(在現代 Linux 上通常是 systemd)。init 接著啟動核心系統服務與登入機制,那些又啟動更多行程,從這唯一的根部建起整棵行程樹。除了啟動東西,init 還有兩項特殊的長駐職責。第一,它是普世的收養者:當任何行程死去而留下變成孤兒的子行程時,那些孤兒被重新歸屬到 init,使它們永遠有一個父行程。第二,當這些被收養的子行程結束時,init 回收它們,防止它們以殭屍的形式滯留。正常運作期間不允許殺掉 init;若 PID 1 真的死掉,核心會發生 panic,因為整個系統都仰賴它。
init 之所以重要,是因為它錨定了整個行程模型:它是行程樹開始的地方,也是那張防止孤兒行程失散、防止殭屍堆積的安全網。一個有用的澄清:「init」指的是一個角色(第一個行程,PID 1),而不同系統用不同的程式來扮演這個角色(經典的 SysV init、systemd、runit 等等)。它們在如何管理服務上有所不同,但全都共有 PID 1 的職責:作為祖先、收養者,以及最後的回收者。
一個背景輔助程式的父行程(命令列直譯器)被關閉了。輔助程式並不會消失,而是被重新歸屬到 init(PID 1),由它成為新的父行程,並在它最終退出時回收它。
孤兒被 init 收養,之後在它們退出時由 init 回收。
「init」是一個角色(PID 1),由不同程式扮演(SysV init、systemd 等)。若 PID 1 死掉,核心會 panic,因為系統仰賴它。