歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Red hat Linux

基礎知識 - 用紅帽子的chkconfig管理Init腳本

用紅帽子的chkconfig管理Init腳本
2004-04-23 15:18 pm
來自:Linux文檔
現載:Www.8s8s.coM
地址:無名

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

我喜歡發現新的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 0ff 1ff 2ff 3ff 4n 5n 6ff
apmd 0ff 1ff 2n 3ff 4n 5ff 6ff
arpwatch 0ff 1ff 2ff 3ff 4ff 5ff 6ff
atd 0ff 1ff 2ff 3n 4n 5n 6ff
autofs 0ff 1ff 2ff 3ff 4ff 5ff 6ff
named 0ff 1ff 2ff 3ff 4ff 5ff 6ff
bootparamd 0ff 1ff 2ff 3ff 4ff 5ff 6ff
keytable 0ff 1ff 2n 3n 4n 5n 6ff
crond 0ff 1ff 2n 3n 4n 5n 6ff
syslog 0ff 1ff 2n 3n 4n 5n 6ff
netfs 0ff 1ff 2ff 3n 4n 5n 6ff
network 0ff 1ff 2n 3n 4n 5n 6ff

在輸出的每一行,最開始的段代表在 /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< > 紅帽子的

#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 0ff 1ff 2n 3n 4n 5n 6ff

而且,我們可以用標准的 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腳本的好處了,雖然它的功能似乎簡單了些,但是它節省時間,這使其成為一個系統管理員適用的命令,值得記牢。

Copyright © Linux教程網 All Rights Reserved