init進程是系統中所有進程的父進程,init進程繁衍出完成通常操作所需的子進程,這些操作包括:設定機器名、檢查和安裝磁碟及檔案系統、啟動系統日誌、配置網路介面並啟動網路和郵件服務,啟動列印服務等。Solaris中init進程的主要任務是按照inittab檔案所提供的資訊建立進程,由於進行系統初始化的那些進程都由init建立,所以init進程也稱為系統初始化進程。下面具體說明inittab檔案的格式。
inittab檔案中每一記錄都從新的一行開始,每個記錄項最多可有512個字元,每一項的格式通常如下:id:rstate:action:process,下面分別解釋。
1.id欄位是最多4個字元的字串,用來唯一標誌表項。
2.rstate(run state)欄位定義該記錄項被調用時的運行層級,rstate可以由一個或多個運行層級構成,也可以是空,空則代表運行層級0~6。當請求init改變運行層級時,那些rstate欄位中不包括新運行層級的進程將收到SIGTERM警告訊號,並且最後被殺死;只有a、b、c啟動的命令外(a、b、c不是真正的運行層級)
# 0 - 停機(千萬不能把initdefault 設定為0 )
# 1 - 單一使用者模式
# 2 - 多使用者,沒有 NFS
# 3 - 完全多使用者模式(標準的運行級)
# 4 - 沒有用到
# 5 - X11 (xwindow)
# 6 - 重新啟動 (千萬不要把initdefault 設定為6 )
3.action欄位告訴init執行的動作,即如何處理process欄位指定的進程,action欄位允許的值及對應的動作分別為:
1)respawn:如果process欄位指定的進程不存在,則啟動該進程,init不等待處理結束,而是繼續掃描inittab檔案中的後續進程,當這樣的進程終止時,init會重新啟動它,如果這樣的進程已存在,則什麼也不做。
2)wait:啟動process欄位指定的進程,並等到處理結束才去處理inittab中的下一記錄項。
3)once:啟動process欄位指定的進程,不等待處理結束就去處理下一記錄項。當這樣的進程終止時,也不再重新啟動它,在進入新的運行層級時,如果這樣的進程仍在運行,init也不重新啟動它。
4)boot:只有在系統啟動時,init才處理這樣的記錄項,啟動相應進程,並不等待處理結束就去處理下一個記錄項。當這樣的進程終止時,系統也不重啟它。
5)bootwait:系統啟動後,當第一次從單一使用者模式進入多使用者模式時處理這樣的記錄項,init啟動這樣的進程,並且等待它的處理結束,然後再進行下一個記錄項的處理,當這樣的進程終止時,系統也不重啟它。
6)powerfail:當init接到斷電的訊號(SIGPWR)時,處理指定的進程。
7)powerwait:當init接到斷電的訊號(SIGPWR)時,處理指定的進程,並且等到處理結束才去檢查其他的記錄項。
8)off:如果指定的進程正在運行,init就給它發SIGTERM警告訊號,在向它發出訊號SIGKILL強制其結束之前等待5秒,如果這樣的進程不存在,則忽略這一項。
9)ondemand:功能通respawn,不同的是,與具體的運行層級無關,只用於rstate欄位是a、b、c的那些記錄項。
10)sysinit:指定的進程在存取控制台之前執行,這樣的記錄項僅用於對某些裝置的初始化,目的是為了使init在這樣的裝置上向使用者提問有關運行層級的問題,init需要等待進程運行結束後才繼續。
11)initdefault:指定一個預設的運行層級,只有當init一開始被調用時才掃描這一項,如果rstate欄位指定了多個運行層級,其中最大的數字是預設的運行層級,如果rstate欄位是空的,init認為欄位是0123456,於是進入層級6,這樣便陷入了一個迴圈,如果inittab檔案中沒有包含initdefault的記錄項,則在系統啟動時請求使用者為它指定一個初始運行層級
4.Process欄位中進程可以是任意的守候進程、可執行指令碼或程式。
另外:在任何時候,可以在檔案inittab中添加新的記錄項,層級Q/q不改變當前的運行層級,重新檢查inittab檔案,可以通過命令init Q或init q使init進程立即重新讀取並處理檔案inittab.