如何在Linux中使用Init命令

Init是所有進程的父項。 它的主要作用是從存儲在文件/ etc / inittab中的腳本創建進程(請參閱inittab (5))。 這個文件通常包含一些條目,這些條目會導致init在用戶可以登錄的每一行上生成getty s。它還控制任何特定係統所需的自治進程。

運行級別

運行級別是系統的軟件配置,它只允許選定的一組進程存在。 每個這些運行級別由init產生的進程都在/ etc / inittab文件中定義。 Init可以處於八個運行級別之一: 0-6Ss 。 通過讓特權用戶運行telinit來改變運行級別,這會向init發送適當的信號,告訴它要更改哪個運行級別。

運行級別0,16被保留。 運行級別0用於暫停系統,運行級別6用於重新啟動系統,運行級別1用於使系統進入單用戶模式。 運行級別S不是直接使用,而是更多用於在進入運行級別1時執行的腳本。有關詳細信息,請參閱關機 (8)和inittab (5)的聯機幫助頁。

運行級別7-9也是有效的,雖然沒有真正記錄。 這是因為“傳統”Unix變體不使用它們。 如果你好奇,運行級別SS實際上是一樣的。 在內部,它們是同一運行級別的別名。

引導

在調用init作為內核引導序列的最後一步之後,它會查找文件/ etc / inittab以查看是否存在initdefault類型的條目(請參閱inittab (5))。 initdefault項決定了系統的初始運行級別。 如果沒有這樣的入口(或者根本沒有/ etc / inittab ),則必須在系統控制台輸入運行級別。

運行級別Ss使系統進入單用戶模式,不需要/ etc / inittab文件。 在單用戶模式下,在/ dev / console上打開一個root shell。

當進入單用戶模式時, init/etc/ioctl.save中讀取控制台的ioctl (2)狀態。 如果該文件不存在, init會9600波特率CLOCAL設置初始化該行。 當init離開單用戶模式時,它將控制台的ioctl設置存儲在該文件中,以便它可以在下一個單用戶會話中重新使用它們。

首次進入多用戶模式時, init會執行引導bootwait條目以允許在用戶登錄之前裝載文件系統。然後處理與運行級別匹配的所有條目。

當啟動一個新進程時, init首先檢查文件/ etc / initscript是否存在。 如果有,它使用這個腳本來啟動這個過程。

每次小孩終止時, init都會記錄事實及其在/ var / run / utmp/ var / log / wtmp中死亡的原因,前提是這些文件存在。

更改運行級別

在它產生了所有指定的進程之後, init等待它的一個後代進程死掉,一個powerfail信號,或者直到telinit發信號通知它改變系統的運行級別。 當上述三種情況之一發生時,它會重新檢查/ etc / inittab文件。 新條目可隨時添加到此文件。 但是, init仍然會等待上述三種情況之一發生。 為了提供即時響應, telinit Qq命令可以喚醒init來重新檢查/ etc / inittab文件。

如果init不處於單用戶模式並收到一個powerfail信號(SIGPWR),它將讀取文件/ etc / powerstatus 。 然後它根據這個文件的內容啟動一個命令:

失敗)

電力失效,UPS正在提供電力。 執行powerwaitpowerfail條目。

好)

電源已恢復,執行powerokwait條目。

低)

電源故障,UPS電量不足。 執行powerfailnow條目。

如果/ etc / powerstatus不存在或者包含其他任何內容,那麼字母FOL ,init的行為就好像它讀取了字母F.

不鼓勵使用SIGPWR/ etc / powerstatus 。 有人想要與init交互應該使用/ dev / initctl控制通道 - 請參閱sysvinit包的源代碼以獲取更多關於此的文檔。

init被要求改變運行級別時,它會發出警告信號SIGTERM給新運行級別中未定義的所有進程。 然後等待5秒鐘,然後通過SIGKILL信號強制終止這些過程。 請注意, init假定所有這些進程(及其後代)都保留在init最初為其創建的同一個進程組中。 如果任何進程更改其進程組聯繫,它將不會收到這些信號。 這些過程需要單獨終止。

使用telinit

/ sbin / telinit鏈接到/ sbin / init 。 它需要一個字符的參數並指示init執行適當的操作。 以下參數作為telinit的指令:

0,1,2,3,4,56

告訴init切換到指定的運行級別。

abc

告訴init只處理具有運行級別abc的那些/ etc / inittab文件條目。

Qq

告訴init重新檢查/ etc / inittab文件。

SS

告訴init切換到單用戶模式。

告訴init重新執行自己(保持狀態)。 不會重新檢查/ etc / inittab文件。 運行級別應該是Ss12345之一 ,否則請求會被默默忽略。

telinit還可以告訴init在發送進程SIGTERM和SIGKILL信號之間應該等待多長時間。 默認值是5秒,但可以使用-t sec選項更改。

telinit只能由具有適當權限的用戶調用。

init二進製文件通過查看進程ID來檢查它是init還是telinit ; 真正的init進程ID總是1由此可見 ,不用調用telinit,也可以使用init來代替快捷方式。