/etc/inittab 文件控制著初始化過程。
/etc/inittab 文件為 init 命令提供腳本作為一個普通進程調(diào)度程序。構(gòu)成 init 命令進程調(diào)度活動的主要(多數(shù))進程是 /etc/getty 線進程(line process),發(fā)起(啟動)專用線進程。被 init 命令特別調(diào)度的其他進程為后臺進程(Daemon)和shell。
/etc/inittab 文件由 位置相關(guān)[position-dependent ]的條目組成,格式如下:
Identifier:RunLevel:Action:Command
每一個條目都被一個換行字符分隔。一個換行字符前面一個反斜杠 (\) 表示一個條目的延續(xù)。/etc/inittab 文件中的條目數(shù)目沒有限制(而不是指條目的最大長度)。條目的最大長度是 1024 個字符。
條目字段有:
Identifier: 標(biāo)識唯一對象的一個 1-4 位字符的字段。
RunLevel: 該條目運行的級別。
運行級別有下列屬性:
- 運行級別有效地符合系統(tǒng)進程的配置。
- 由 init 命令啟動的每一個進程都被分配一個或多個該進程可存在于之的運行級別。
- 運行級別由 0-9 的數(shù)字來表示。例如,如果系統(tǒng)運行于級別 1,只有在運行級別字段有 1 的那些條目被啟動。
- 請求 init 命令改變運行級別時,條目中運行級別字段與目標(biāo)運行級別不匹配的所有進程都會收到一條警告信號 (SIGTERM),在進程被刪除符號[kill signal (SIGKILL)]強行終止前,有20秒的寬限期。
- 運行級別字段可為一個進程定義多個運行級別,可以0-9的任意組合。如果沒有指定運行級別,進程假定在所有的運行級別有效。
- 還有其他四個值會出現(xiàn)在運行級別字段,即使他們并不是真正的運行級別:a, b, c 和 h。在運行級別字段有這些字符的條目僅僅在telinit 命令請求時才運行(與當(dāng)前的系統(tǒng)運行級別無關(guān))。他們不同于init命令的運行級別,init命令永遠不能進入a, b, c, h 運行級別。并且,所有這些進程的運行請求都不改變當(dāng)前的運行級別。此外,init 命令改變級別時,由a, b, c 命令啟動的進程并不斷開(killed)。只有當(dāng) /etc/inittab 文件中他們的行在action字段標(biāo)記為 off,他們的行從 /etc/inittab 文件中完全刪除,或者init 命令進入單用戶模式,這些進程才會被中斷(killed)。
Action: 告知 init 命令如何處理在 process 字段指定的進程。init 命令可識別的 actions 如下:
respawn: 如果進程不存在,則啟動進程。卻不等待進程終止(繼續(xù)掃描 /etc/inittab 文件)。如進程死掉,則重啟該進程。如進程存在,繼續(xù)掃描 /etc/inittab 文件。
wait: 當(dāng) init 命令進入匹配某條目的運行級別時,啟動該進程并等待該進程的終止。當(dāng)init命令處于同樣的運行級別時,所有對 /etc/inittab 文件隨后的讀取都會導(dǎo)致 init 命令忽略該條目。
once: 當(dāng) init 命令進入匹配某條目的運行級別時,啟動該進程,并且不等待終止。當(dāng)進程死掉時,也不重啟該進程。當(dāng)系統(tǒng)進入一個新的運行級別時,該進程仍然從之前運行級別的變化運行,程序也不重啟。
boot: 只在系統(tǒng)引導(dǎo)過程中運行的條目,這些進程是系統(tǒng)啟動過程中,init 命令從 /etc/inittab 文件中讀取的。啟動該進程,不等待進程終止,并且進程死掉時,也不重啟進程。有意義的指導(dǎo)依次為,運行級別應(yīng)為默認(rèn),或者必須與系統(tǒng)引導(dǎo)時 init 命令的運行級別匹配。此 action 對于系統(tǒng)硬件重啟后的初始化功能非常有用。
bootwait: 系統(tǒng)引導(dǎo)后,init 命令從單用戶到多用戶狀態(tài),第一次運行的條目。啟動該進程,并等其終止,進程死時,不重啟該進程。如果 initdefault為 2 ,則系統(tǒng)引導(dǎo)后直接運行該進程。
powerfail: 只有當(dāng) init 命令收到一個電源故障信號(SIGPWR)的時候,才執(zhí)行與此條目相關(guān)的進程。
powerwait: 只有當(dāng) init 命令收到一個電源故障信號(SIGPWR)的時候,才執(zhí)行與此條目相關(guān)的進程。并等該進程終止,才繼續(xù)處理 /etc/inittab 文件。
off: 如果與該條目相關(guān)的進程當(dāng)前正在運行,發(fā)送一個警告信號(SIGTERM),然后等待 20 秒才用 kill 信號(SIGKILL)終止該進程。如果進程不在運行,忽略該條目。
ondemand: 功能上與 respawn 相同,不過,此 action 應(yīng)用 a, b, 或 c 值,而不用運行級別。
initdefault: init 命令只在 最初調(diào)用時才掃描與此 action 相關(guān)的條目。如果存在,init 命令使用該條目來決定初始進入的運行級別。一般情況下,使用run-level 字段中指定的最高運行級別來作為初始狀態(tài)。如果運行級別字段為空,則認(rèn)作0123456789;因此,init 命令進入運行級別 9 。另外,如果 init 命令在 /etc/inittab 文件中找不到initdefault 條目,則在引導(dǎo)時向用戶請求一個初始的運行級別。
sysinit: 此類型的條目在登錄前 init 命令正要訪問控制臺之前被執(zhí)行。該條目只被用來初始化設(shè)備,init 命令可能會針對這些設(shè)備詢問運行級別。這些條目被執(zhí)行,并等待完成后才繼續(xù)。
Command: 可執(zhí)行的殼(shell)命令。整個 command 字段以 exec 為前綴,并傳給一個 forked sh成為 sh -c exec 命令。任何合法的 sh 命令語法都可出現(xiàn)在該字段。并可用 # 插入注釋。
getty 命令覆寫 /etc/inittab 文件中出現(xiàn)在它之前所有命令的輸出。要在引導(dǎo)日志中記錄這些命令的輸出,可輸送這些輸出到 alog -tboot 命令。
當(dāng) init 命令正在處理 inittab 條目時,stdin, stdout, 和 stderr 這些文件描述符(file descriptors)可能是不可用的。所有寫入 stdout 或 stderr 的條目不起作用,除非把輸出重定向到一個文件或者到 /dev/console。
下列命令是唯一支持在 /etc/inittab 文件中修改記錄的方法:
mkitab: 把記錄添加到 /etc/inittab 文件。
lsitab: 列出 /etc/inittab 文件中的記錄。
chitab: 修改 /etc/inittab 文件中的記錄。
rmitab: 從 /etc/inittab 文件中刪除記錄。
例如,想在 /etc/inittab 文件中添加一條記錄,以運行級別2(run level 2)運行 find 命令并使之一旦完成就再次啟動。
1. 運行 ps 命令,只顯示包含 find 的進程:
# ps -ef | grep find
root 19750 13964 0 10:47:23 pts/0 0:00 grep find
#
2. 使用 mkitab 命令,在 /etc/inittab 文件中添加一個名為 xcmd 的記錄:
# mkitab "xcmd:2:respawn:find / -type f > /dev/null 2>&1"
3. 使用 lsitab 命令顯示新記錄:
# lsitab xcmd
xcmd:2:respawn:find / -type f > /dev/null 2>&1
#
4. 查看進程:
# ps -ef | grep find
root 25462 1 6 10:56:58 - 0:00 find / -type f
root 28002 13964 0 10:57:00 pts/0 0:00 grep find
#
5. 取消 find 命令進程:
# kill 25462
6. 查看進程:
# ps -ef | grep find
root 23538 13964 0 10:58:24 pts/0 0:00 grep find
root 28966 1 4 10:58:21 - 0:00 find / -type f
#
本例中,由于 action 字段被配置 respawn,故而每一次該命令一完成,一個新進程就會啟動。
該進程將繼續(xù)再生 (re-spawning),除非修改 action 字段,例如:
1. 把記錄 xcmd 的 action 字段由 respawn 修改為 once:
# chitab "xcmd:2:once:find / -type f > /dev/null 2>&1"
2. 查看進程:
# ps -ef | grep find
root 20378 13964 0 11:07:20 pts/0 0:00 grep find
root 28970 1 4 11:05:46 - 0:03 find / -type f
3. 取消 find 命令進程:
# kill 28970
4. 查看進程:
# ps -ef | grep find
root 28972 13964 0 11:07:33 pts/0 0:00 grep find
#
要從 /etc/inittab 文件中刪除該記錄,可使用 rmitab 命令。例如:
# rmitab xcmd
# lsitab xcmd
#
/etc/inittab 條目的次序
/etc/inittab 文件中的基本進程條目次序安裝如下:
1. initdefault
2. sysinit
3. Powerfailure Detection (powerfail)
4. Multiuser check (rc)
5. /etc/firstboot (fbcheck)
6. System Resource Controller (srcmstr)
7. Start TCP/IP daemons (rctcpip)
8. Start NFS daemons (rcnfs)
9. cron
10.pb cleanup (piobe)
11.getty for the console (cons)
系統(tǒng)資源控制器 (SRC)必須在 /etc/inittab 文件的開頭附近就被啟動,因為啟動其他的進程需要SRC進程(Daemon)。
由于NFS需要TCP/IP進程(Daemon)才能正常運行,所以TCP/IP進程必須在NFS進程之前被啟動。
/etc/inittab 文件中的條目按相互依賴性排序,就是說,如果一個進程(process2)需要另外一個進程(process1)存在才能正常運行,那么在 /etc/inittab文件中,process1的條目應(yīng)該在process2的條目之前。