奇葛格的BLOG

          紅塵最可笑,我自樂逍遙

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            59 隨筆 :: 23 文章 :: 11 評論 :: 0 Trackbacks
          [http://www.freelamp.com/1003237634/index_html]
          [http://biz.chinabyte.com/477/2024477.shtml]

          ? Linux 可以有多種運行級。常見的就是多用戶的2(單用戶,沒有NFS),3(完整的多用戶),4(用戶自定義),5(X),很多人知道 5 是運行 X-Windows 的級別,而 0 就是關機了。運行級的改變可以通過 init 命令來切換。例如,假設你要維護系統(tǒng)進入單用戶狀態(tài),那么,可以使用 init 1 來切換。在Linux 的運行級的切換過程中,系統(tǒng)會自動尋找對應運行級的目錄/etc/rc[0-6].d下的K 和 S 開頭的文件,按后面的數字順序,執(zhí)行這些腳本。
          ? 每一個運行級在 /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系統(tǒng)中這很典型。一旦init被啟動 ,讀取/etc/inittab 。 從第一行,我們知道 init 將在系統(tǒng)啟動后從運行運行級3。一旦我們到了那個運行級 ,第二行告訴 init 去運行腳本 /etc/rc.d/rc 3 并且在執(zhí)行前等待終止。

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

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

          語法為:
          chkconfig --list [name]
          chkconfig --add name
          chkconfig --del name
          chkconfig [--level levels] name <on|off|reset>
          chkconfig [--level levels] name

          chkconfig 有五項功能:添加服務,刪除服務,列表服務,改變啟動信息以及檢查特定服務的啟動狀態(tài)。

          chkconfig 沒有參數運行時,顯示用法。如果加上服務名,那么就檢查這個服務是否在當前運行級啟動。如果是,返回 true,否則返回 false。
          --level 選項可以指定要查看的運行級而不一定是當前運行級。

          如果在服務名后面指定了on,off 或者 reset,那么 chkconfig 會改變指定服務的啟動信息。on 和 off 分別指服務在改變運行級時的啟動和停止。reset 指初始化服務信息,無論有問題的初始化腳本指定了什么。

          對于 on 和 off 開關,系統(tǒng)默認只對運行級 3,4, 5有效,但是 reset 可以對所有運行級有效。指定 --level 選項時,可以選擇特定的運行級。

          需要說明的是,對于每個運行級,只能有一個啟動腳本或者停止腳本。當切換運行級時,init 不會重新啟動已經啟動的服務,也不會再次去停止已經停止的服務。


          選項介紹:
          --level levels 指定運行級,由數字 0 到 7 構成的字符串,如:
          --level 35 表示指定運行級3 和5。

          --add name
          這個選項增加一項新的服務,chkconfig 確保每個運行級有一項 啟動(S) 或者 殺死(K) 入口。如有缺少,則會從缺省的init 腳本自動建立。

          --del name
          用來刪除服務,并把相關符號連接從 /etc/rc[0-6].d 刪除。

          --list name
          列表,如果指定了name 那么只是顯示指定的服務名,否則,列出全部服務在不同運行級的狀態(tài)。


          運行級文件
          每個被chkconfig 管理的服務需要在對應的init.d 下的腳本加上兩行或者更多行的注釋。
          第一行告訴 chkconfig 缺省啟動的運行級以及啟動和停止的優(yōu)先級。如果某服務缺省不在任何運行級啟動,那么使用 - 代替運行級。
          第二行對服務進行描述,可以用\ 跨行注釋。
          例如,random.init 包含三行:
          # chkconfig: 2345 20 80
          # description: Saves and restores system entropy pool for \
          # higher quality random number generation.
          表明 random 腳本應該在運行級 2, 3, 4, 5 啟動,啟動優(yōu)先權為20,停止優(yōu)先權為 80。
          具體詳細參見/etc/rc.d/init.d 下的腳本.

          ??? 啟動基礎知識

          ? chkconfig的二進制軟件在 /sbin下,默認權限允許任何用戶執(zhí)行 。不過沒有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腳本名。 其余的區(qū)段表示腳本進入各個運行級時的各運行級0-6的狀態(tài)。 例如,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'' 節(jié) (0, 1, 6), 一個 kill腳本存在 script is in place 每一個``on'' 節(jié) (2, 3, 4, 5),有一個 start腳本。 接下來,執(zhí)行一個不同的 find 命令以確信每個發(fā)現(xiàn)的文件的類型:

          以下是引用片段:
            [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的 項幾乎和列出現(xiàn)在的設置一樣容易。格式:

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

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

            #?chkconfig?--level?2?crond?off

            (root執(zhí)行) 會在運行級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最為守護進程就不是必要的了。這種情 況,我發(fā)現(xiàn)禁止sendmail服務很有必要,減少了潛在的安全問題,從chkconfig中刪掉sendmail,輸入:

            chkconfig?--del?sendmail

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


            [root]#?find?/etc/rc.d?-name?’*sendmail’?-print
            /etc/rc.d/init.d/sendmail
             在我看來這很完美。腳本保留了,萬一 sendmail 需要作為一個服務實現(xiàn)呢?不過所有的符號連接去掉了。我們能在每一個運行級禁止sendmail 服務,這將在每一個rc*.d子目錄中放置一個kill腳本,雖然sendmail從不在初始化階段啟動,是個不必要的任務 ,可是,我曾看到一些系統(tǒng)管理員需要在特定的場合手工啟動服務 。把kill腳本留在那里確保可以干凈的殺掉服務。

            添加一個chkconfig 項

            到目前為止,一切順利。我們已經知道使用chkconfig如何查看、調整、刪掉服務。現(xiàn)在添加一個新的服務。看下面的腳本 oracle (see Listing 1).

            #!/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腳本聯(lián)合使用。

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

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

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

            注意腳本中的兩行注釋:

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

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

            現(xiàn)在腳本在合適的位置,并且有合適的執(zhí)行權限,以及恰當的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連接的名字包含優(yōu)先權05而start連接包含80。如果你需要調整優(yōu)先權, (e.g.我們停止的優(yōu)先權需要設為 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執(zhí)行。這個腳本運行一個帶有SIGUSR2信號的kill 指示 xinetd 進行一個“硬“重配置。

            那意味著什么?哦,當我測試的時候,通過xinetd 提供的活動服務(i.e., Telnet, FTP, etc.)立刻被中止。如果你能計劃在最合適的時間啟動/禁止你的系統(tǒng)上的服務,可能不是個問題。作為一種替代方式,你可以調整你的 /etc/init.d/xinetd腳本 ,這樣 reload 選項發(fā)送一個 SIGUSR1 信號。 這是個“軟“重配置。這將重啟動你的服務而不中斷你現(xiàn)存的連接 。

            chkconfig 管理下,添加xinetd服務只要簡單的添加xinetd服務文件到 /etc/xinetd.d目錄中。chkconfig會自動的“撿起“它并使其可用,通過chkconfig 工具進行管理。簡潔阿!

            結論

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



          posted on 2006-07-28 18:02 奇葛格 閱讀(758) 評論(0)  編輯  收藏 所屬分類: Servers
          主站蜘蛛池模板: 大同市| 云浮市| 大化| 迁西县| 东乡| 汾西县| 罗江县| 中宁县| 浪卡子县| 图片| 许昌县| 房产| 通化市| 张家界市| 凤庆县| 曲水县| 彰化县| 古浪县| 彭水| 舟曲县| 花垣县| 吉水县| 巴彦淖尔市| 通山县| 富阳市| 香格里拉县| 冷水江市| 五指山市| 永修县| 紫阳县| 开化县| 县级市| 铁岭市| 新龙县| 惠东县| 都江堰市| 叶城县| 明水县| 儋州市| 黑水县| 陕西省|