用chkconfig 管理 Init 腳本[轉貼]

用紅帽子的 chkconfig 管理 Init 腳本
Jimmy Ball 翻譯:Feng Dahui 

轉載 LinuxAid



 

你的管理工具中多了個簡單但非常有用的東東。 


我喜歡發現新的UNIX 命令,尤其是那些關於系統管理的。當我得知紅帽子發佈chkconfig 這個工具,我想起了在IRIX--一個從  Silicon Graphics Inc.而來的UNIX變種--下的 chkconfig。 IRIX的chkconfig被用來激活/禁止系統初 始化的時候的服務,無需編輯,重命名或是移動 /etc中的init腳本。 

類似,Red Hat設計chkconfig的目的就是用來管理系統初始化的時候啓動的服務。不過,在我仔細閱讀手冊並作了些測試後,我很快發現  Red Hat擴展了chkconfig,通過管理init腳本的符號連接得以最終控制啓動關閉時的系統任務,真是節省時間! 


關於啓動的基礎知識 


當你的linux啓動時, 它顯示的第一個進程是 init。如果你以前沒看到過顯示init進程, 輸入: 

# ps -ef | grep init 

就會看到init的PID。 簡而言之,init 運行 /etc/inittab中描述的任務。 

/etc/inittab中說明的任務在init之後就會啓動, 不過其它的任務啓動很簡單。例如,默認情況下 Red Hat的 /etc/inittab 對Ctrl-Alt-Delete鍵序設置了一個陷阱(trap),當這些鍵在控制檯模式下(不是xdm)同時按下,就會運行  shutdown 命令。 在啓動的時候, init基於/etc/inittab 的設置選項設定這個特性,不過在這個鍵序發生的時候纔會執行。 

inittab 的格式允許以"#"開始註釋行,正常的條目用 ":" 界定。遵從如下的格式: 

id:runlevel:action:process 

id 代表用戶定義的唯一的標誌, 
runlevel 可以使0-6的組合或者爲空, 
action 來自一個關鍵詞keyword 描述init如何對待process, 
process 是要執行的命令。 


描述action字段的各種關鍵字可以在inittab的手冊中找到。常用的關鍵字, 不是全部, UNIX平臺包括這些: 

initdefault--定義一個系統啓動後進入的運行級 
wait --會被執行一次的進程 (當進入運行級的時候)。init 進程將等待這個進程被終止。 
boot --定義一個啓動的時候執行的進程. 
bootwait --與 boot 類似 ,不過 init在繼續運行前等待進程的終止 
sysinit --定義一個進程在 boot的時候執行,在任何 boot或者bootwait inittab 條目的前面執行。 

runlevel 字段指明系統狀態。例如,運行級0代表系統關機,運行級6代表系統重啓 。不幸的事,不是所有的Linux 發佈都遵循同樣的運行級定義 。在Red Hat中,默認情況下支持下面這些 

0. 系統掛起 
1. 但用戶Single-user mode 
2. 多用戶,沒有NFS 
3. 完整的多用戶Complete multiuser mode 
4. 用戶自定義 
5. X11 (XDM 登陸) 
6. 重新啓動 

每一個運行級在 /etc/rc.d下都有個相應的目錄。如運行級5,目錄就是/etc/rc.d/rc5.d 。包含啓動這個運行級的時候運行 的相關任務的相關文件。在 Red Hat中, 這些文件一般都是 shell 腳本的符號連接,可以在/etc/rc.d/init.d中找到。 

讓我們用一個簡單的例子看一下這些東西, 下面這兩個例子行來自我們的inittab文件: 


id:3:initdefault: 
l3:3:wait:/etc/rc.d/rc 3 

在Red Hat系統中這很典型。一旦init被啓動 ,讀取/etc/inittab 。 從第一行,我們知道 init 將在系統啓動後從運 行運行級3。一旦我們到了那個運行級 ,第二行告訴 init 去運行腳本 /etc/rc.d/rc 3 並且在執行前等待終止. 

在/etc/rc.d目錄的rc 腳本收到 3作爲一個參數。 這個 3 相當於運行級3。結果 rc 腳本執行/etc/rc.d/rc3.d 目錄中的所有腳本。它首先用參數"stop"執行所有 K (代表 "kill"殺掉進程或者服務)打頭的腳本,接下來,它運行所有以 字母 S 打頭的 腳本,帶有參數"start" 啓動進程或者服務。最後要指明,K和S腳本的執行順序是基於排序的; 名爲 S90mysql的腳本將在  S95httpd之前執行。 

/etc/rc.d/rc3.d 中的腳本實際是對/etc/rc.d/init.d中文件的符號連接。 UNIX管理員可以在rc3.d中放制 文件, 實際情況下Red Hat的init.d目錄是所有腳本的第一位置,然後聲稱邏輯連接到 rc*.d 目錄。手工作這些文件的管理很煩人、瑣碎。  chkconfig現在接手這件事情! Red Hat 的這個chkconfig工具就是專爲管理/etc/rc.d/rc[0-6].d中的符號連 接而設計。 


查看chkconfig 的項(Entries) 

chkconfig的二進制軟件在 /sbin下,默認權限允許任何用戶執行 。不過沒有root權限的用戶只能察看當前的chkconfig配置。輸入 


[root]# chkconfig --list | grep on 

輸出的部分內容大致如下: 

amd 0:off 1:off 2:off 3:off 4:on 5:on 6:off 
apmd 0:off 1:off 2:on 3:off 4:on 5:off 6:off 
arpwatch 0:off 1:off 2:off 3:off 4:off 5:off 6:off 
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off 
autofs 0:off 1:off 2:off 3:off 4:off 5:off 6:off 
named 0:off 1:off 2:off 3:off 4:off 5:off 6:off 
bootparamd 0:off 1:off 2:off 3:off 4:off 5:off 6:off 
keytable 0:off 1:off 2:on 3:on 4:on 5:on 6:off 
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off 
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off 
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off 
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off 

在輸出的每一行,最開始的段代表在 /etc/rc.d/init.d中的init腳本名。其餘的區段表示腳本進入各個運行級時的各運行級0-6 的狀態。 例如,crond應當在進入運行級2,3, 4,5 的時候啓動,當進入 0, 1 and 6的時候停止。我們可以通過find命令查找在 /etc/rc.d中所有crond結尾的文件確信我們設置的正確性: 

[root]# find /etc/rc.d -name '*crond' -print 
/etc/rc.d/init.d/crond 
/etc/rc.d/rc0.d/K60crond 
/etc/rc.d/rc1.d/K60crond 
/etc/rc.d/rc2.d/S40crond 
/etc/rc.d/rc3.d/S40crond 
/etc/rc.d/rc4.d/S40crond 
/etc/rc.d/rc5.d/S40crond 
/etc/rc.d/rc6.d/K60crond 

注意chkconfig報告的每個 "off" 節 (0, 1, 6), 一個 kill腳本存在 script is in place 每 一個"on" 節 (2, 3, 4, 5),有一個 start腳本。 接下來,執行一個不同的 find 命令以確信每個發現的文件的類型: 

[root]# find /etc/rc.d -name '*crond' -exec file {} ; 
/etc/rc.d/init.d/crond: Bourne shell script text 
/etc/rc.d/rc0.d/K60crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc1.d/K60crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc2.d/S40crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc3.d/S40crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc4.d/S40crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc5.d/S40crond: symbolic link to 
../init.d/crond 
/etc/rc.d/rc6.d/K60crond: symbolic link to 
../init.d/crond 

這表明在init.d中找到的crond是一個shell腳本,找到的所有其他的文件都是對 crond 腳本的符號連接。 

調整chkconfig項 


調整chkconfig的 項幾乎和列出現在的設置一樣容易。格式: 


chkconfig [--level <運行級>;] <名字>; 

例如,如果我們決定在運行級 2禁止crond, 

# chkconfig --level 2 crond off 

(root執行) 會在運行級2關掉crond. 運行 chkconfig --list會確信crond的配置已經被調整。 更進一步,下面的find 命令command 顯示一個 kill腳本已經在目錄rc2.d中代替了 start腳本 : 

[root]# find /etc/rc.d -name '*crond' -print 
/etc/rc.d/init.d/crond 
/etc/rc.d/rc0.d/K60crond 
/etc/rc.d/rc1.d/K60crond 
/etc/rc.d/rc2.d/K60crond 
/etc/rc.d/rc3.d/S40crond 
/etc/rc.d/rc4.d/S40crond 
/etc/rc.d/rc5.d/S40crond 
/etc/rc.d/rc6.d/K60crond 

緊記 chkconfig不是立即自動禁止或激活一個服務的 它只是簡單的改變了符號連接,超級用戶可以用這個命令  /etc/rc.d/init.d/crond stop立刻禁止crond服務。最後,你可以用一個命令行激活/禁止多個運行級的某個命令 。例如輸 入: 

chkconfig --levels 2345 crond on 

會設定 crond 在運行級2, 3, 4 和 5啓動。 


刪掉一項 


有的時候,刪掉一個服務也很恰當。 例如,針對sendmail, 在客戶機上導入本地賬號的郵件沒有必要。運行sendmail最爲守護進程就 不是必要的了。這種情況,我發現禁止sendmail服務很有必要,減少了潛在的安全問題,從chkconfig中刪掉sendmail,輸入: 

chkconfig --del sendmail 

在下面,我們的find命令顯示該處沒有符號連接了,不過sendmail的init腳本仍然有: 

[root]# find /etc/rc.d -name '*sendmail' -print /etc/rc.d/init.d/sendmail 

在我看來這很完美。腳本保留了,萬一 sendmail 需要作爲一個服務實現呢?不過所有的符號連接去掉了。我們能在每一個運行級禁止 sendmail 服務,這將在每一個rc*.d子目錄中放置一個kill腳本,雖然sendmail從不在初始化階段啓動,是個不必要的任務,可是,我 曾看到一些系統管理員需要在特定的場合手工啓動服務 。把kill腳本留在那裏確保可以乾淨的殺掉服務。 


添加一個chkconfig 項 


到目前爲止,一切順利,我們已經知道使用chkconfig如何查看、調整、刪掉服務。現在添加一個新的服務。看下面的腳本。 

---------------------------------------------------- 
Listing 1. Oracle Script 
---------------------------------------------------- 
#!/bin/sh<\n>; 紅帽子的 

#chkconfig: 2345 80 05 
#description: Oracle 8 Server 

ORA_HOME=/usr/home/oracle/product/8.0.5 
ORA_OWNER=oracle 

if [ ! -f $ORA_HOME/bin/dbstart ] 
then 
echo "Oracle startup: cannot start" 
exit 
fi 

case "$1" in 
"start") 
su-$ORA_OWNER -c $ORA_HOME/bin/dbstart 
su-$ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start" 
;; 
"stop") 
su-$ORA_OWNER -c $ORA_HOME/bin/dbshut 
su-$ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop" 
;; 
esac 
----------------------------------------------------- 


使用這個腳本, Oracle 8可以以參數 "start"啓動,以 "stop" 參數停止。它符合init腳本的最小要求可以和 /etc/rc.d/rc腳本聯合使用。 

把腳本放到 /etc/rc.d/init.d中並運行 (以 root) : 


chmod +x /etc/rc.d/init.d/oracle 

使你的腳本可執行 。如果你擔心普通用戶察看這個腳本,你可以設定更嚴格的文件權限 。只要這個腳本可以被root作爲單獨的腳本運行就可以。 

注意腳本中的兩行註釋: 


#chkconfig: 2345 80 05 
#description: Oracle 8 Server 

chkconfig需要這些行來決定如何實現初始運行級添加服務,如何設定啓動和停止順序的優先級 。這些行指明腳本將爲運行級2,3,4,5啓動 Oracle 8 服務。另外,啓動優先權將被設定爲 80而停止優先權設定爲05。 

現在腳本在合適的位置,並且有合適的執行權限,以及恰當的chkconfig註釋,我們可以添加init腳本,作爲 root, 

# chkconfig --add oracle. 

用 chkconfig的查詢,我們能覈實我們所作的添加: 


[root]# chkconfig --list | grep oracle 
oracle 0:off 1:off 2:on 3:on 4:on 5:on 6:off 

而且,我們可以用標準的 find 命令察看chkconfig如何設定符號連接: 

[root]# find /etc/rc.d -name '*oracle' -print 

/etc/rc.d/init.d/oracle 
/etc/rc.d/rc0.d/K05oracle 
/etc/rc.d/rc1.d/K05oracle 
/etc/rc.d/rc2.d/S80oracle 
/etc/rc.d/rc3.d/S80oracle 
/etc/rc.d/rc4.d/S80oracle 
/etc/rc.d/rc5.d/S80oracle 
/etc/rc.d/rc6.d/K05oracle 

正如需要的那樣,kill連接的名字包含優先權05而start連接包含80。如果你需要調整優先權,(e.g.我們停止的優先權需要設爲  03),簡單的調整oracle init腳本的chkconfig 註釋行並運行 reset命令 command,如下所示。符號連接會被改名: 

[root]# chkconfig oracle reset 
[root]# find /etc/rc.d -name '*oracle' -print 
/etc/rc.d/init.d/oracle 
/etc/rc.d/rc0.d/K03oracle 
/etc/rc.d/rc1.d/K03oracle 
/etc/rc.d/rc2.d/S80oracle 
/etc/rc.d/rc3.d/S80oracle 
/etc/rc.d/rc4.d/S80oracle 
/etc/rc.d/rc5.d/S80oracle 
/etc/rc.d/rc6.d/K03oracle 

Red Hat 7中的改進 


大家可能都知道了,inetd在 Red Hat 7種已經被xinetd 所取代。而且,chkconfig 的功能已經被擴展,可以管理一些xinetd的Internet服務。例子如下: 


[root]# chkconfig --list 
... 
xinetd based services: 
finger: on 
linuxconf-web: off 
rexec: off 
rlogin: off 
rsh: off 
ntalk: off 
talk: off 
telnet: on 
tftp: off 
wu-ftpd: on 

禁掉一個 xinetd 服務,可能是 finger,你應該輸入: 

[root]# chkconfig finger off. 

很簡潔啊,呵呵。可是,這裏有個問題。當配置已經改變,命令/etc/init.d/xinetd reload指明xinetd 自動重載入新 的配置,被 chkconfig執行。這個腳本運行一個帶有SIGUSR2信號的kill 指示 xinetd 進行一個"硬"重配置。 

那意味着什麼?哦,當我測試的時候,通過xinetd 提供的活動服務(i.e., Telnet, FTP, etc.)立刻被中止。 

如果你能計劃在最合適的時間啓動/禁止你的系統上的服務,可能不是個問題。作爲一種替代方式,你可以調整你的 /etc/init.d/xinetd腳本,這樣 reload 選項發送一個 SIGUSR1 信號。 這是個"軟"重配置。這將重啓動你的服務而不中 斷你現存的連接。chkconfig 管理下,添加xinetd服務只要簡單的添加xinetd服務文件到 /etc/xinetd.d目錄中。 chkconfig會自動的"撿起"它並使其可用,通過chkconfig 工具進行管理。簡潔阿! 

結論 

現在你已經應該認識到紅帽子的chkconfig工具管理init腳本的好處了,雖然它的功能似乎簡單了些,但是它節省時間,這使其成爲一個系統管理員適用的命令,值得記牢。

發佈了14 篇原創文章 · 獲贊 1 · 訪問量 5509
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章