奇葛格的BLOG

          紅塵最可笑,我自樂逍遙

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

          ? Linux 可以有多種運(yùn)行級。常見的就是多用戶的2(單用戶,沒有NFS),3(完整的多用戶),4(用戶自定義),5(X),很多人知道 5 是運(yùn)行 X-Windows 的級別,而 0 就是關(guān)機(jī)了。運(yùn)行級的改變可以通過 init 命令來切換。例如,假設(shè)你要維護(hù)系統(tǒng)進(jìn)入單用戶狀態(tài),那么,可以使用 init 1 來切換。在Linux 的運(yùn)行級的切換過程中,系統(tǒng)會自動尋找對應(yīng)運(yùn)行級的目錄/etc/rc[0-6].d下的K 和 S 開頭的文件,按后面的數(shù)字順序,執(zhí)行這些腳本。
          ? 每一個(gè)運(yùn)行級在 /etc/rc.d下都有個(gè)相應(yīng)的目錄。如運(yùn)行級5,目錄就是/etc/rc.d/rc5.d 。包含啟動這個(gè)運(yùn)行級的時(shí)候運(yùn)行的相關(guān)任務(wù)的相關(guān)文件。在 Red Hat中, 這些文件一般都是 shell 腳本的符號連接,可以在/etc/rc.d/init.d中找到。

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

          以下是引用片段:
            id:3:initdefault:
            l3:3:wait:/etc/rc.d/rc?3

            在Red Hat系統(tǒng)中這很典型。一旦init被啟動 ,讀取/etc/inittab 。 從第一行,我們知道 init 將在系統(tǒng)啟動后從運(yùn)行運(yùn)行級3。一旦我們到了那個(gè)運(yùn)行級 ,第二行告訴 init 去運(yùn)行腳本 /etc/rc.d/rc 3 并且在執(zhí)行前等待終止。

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

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

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

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

          chkconfig 沒有參數(shù)運(yùn)行時(shí),顯示用法。如果加上服務(wù)名,那么就檢查這個(gè)服務(wù)是否在當(dāng)前運(yùn)行級啟動。如果是,返回 true,否則返回 false。
          --level 選項(xiàng)可以指定要查看的運(yùn)行級而不一定是當(dāng)前運(yùn)行級。

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

          對于 on 和 off 開關(guān),系統(tǒng)默認(rèn)只對運(yùn)行級 3,4, 5有效,但是 reset 可以對所有運(yùn)行級有效。指定 --level 選項(xiàng)時(shí),可以選擇特定的運(yùn)行級。

          需要說明的是,對于每個(gè)運(yùn)行級,只能有一個(gè)啟動腳本或者停止腳本。當(dāng)切換運(yùn)行級時(shí),init 不會重新啟動已經(jīng)啟動的服務(wù),也不會再次去停止已經(jīng)停止的服務(wù)。


          選項(xiàng)介紹:
          --level levels 指定運(yùn)行級,由數(shù)字 0 到 7 構(gòu)成的字符串,如:
          --level 35 表示指定運(yùn)行級3 和5。

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

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

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


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

          ??? 啟動基礎(chǔ)知識

          ? chkconfig的二進(jìn)制軟件在 /sbin下,默認(rèn)權(quán)限允許任何用戶執(zhí)行 。不過沒有root權(quán)限的用戶只能察看當(dāng)前的 chkconfig配置。輸入:

          [root]#?chkconfig?--list?|?grep?on

            輸出的部分內(nèi)容大致如下:

            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ū)段表示腳本進(jìn)入各個(gè)運(yùn)行級時(shí)的各運(yùn)行級0-6的狀態(tài)。 例如,crond應(yīng)當(dāng)在進(jìn)入運(yùn)行級2,3, 4,5 的時(shí)候啟動,當(dāng)進(jìn)入 0, 1 and 6的時(shí)候停止。我們可以通過find命令查找在/etc/rc.d中所有crond結(jié)尾的文件確信我們設(shè)置的正確性:

          以下是引用片段:
            [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報(bào)告的每個(gè) ``off'' 節(jié) (0, 1, 6), 一個(gè) kill腳本存在 script is in place 每一個(gè)``on'' 節(jié) (2, 3, 4, 5),有一個(gè) start腳本。 接下來,執(zhí)行一個(gè)不同的 find 命令以確信每個(gè)發(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是一個(gè)shell腳本,找到的所有其他的文件都是對 crond 腳本的符號連接。

          ??? 調(diào)整chkconfig項(xiàng)

            調(diào)整chkconfig的 項(xiàng)幾乎和列出現(xiàn)在的設(shè)置一樣容易。格式:

            chkconfig [--level <運(yùn)行級>] <名字>

            例如,如果我們決定在運(yùn)行級 2禁止crond,

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

            (root執(zhí)行) 會在運(yùn)行級2關(guān)掉crond. 運(yùn)行 chkconfig --list會確信crond的配置已經(jīng)被調(diào)整。 更進(jìn)一步,下面的find 命令command 顯示一個(gè) kill腳本已經(jīng)在目錄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不是立即自動禁止或激活一個(gè)服務(wù)的,它只是簡單的改變了符號連接,超級用戶可以用這個(gè)命令 /etc/rc.d/init.d/crond stop立刻禁止crond服務(wù)。最后,你可以用一個(gè)命令行激活/禁止多個(gè)運(yùn)行級的某個(gè)命令 。 例如輸入:

            chkconfig --levels 2345 crond on
            會設(shè)定 crond 在運(yùn)行級2, 3, 4 和 5啟動。

          ??? 刪掉一項(xiàng)

            有的時(shí)候, 刪掉一個(gè)服務(wù)也很恰當(dāng)。例如,針對sendmail,在客戶機(jī)上導(dǎo)入本地賬號的郵件沒有必要。運(yùn)行sendmail最為守護(hù)進(jìn)程就不是必要的了。這種情 況,我發(fā)現(xiàn)禁止sendmail服務(wù)很有必要,減少了潛在的安全問題,從chkconfig中刪掉sendmail,輸入:

            chkconfig?--del?sendmail

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


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

            添加一個(gè)chkconfig 項(xiàng)

            到目前為止,一切順利。我們已經(jīng)知道使用chkconfig如何查看、調(diào)整、刪掉服務(wù)。現(xiàn)在添加一個(gè)新的服務(wù)。看下面的腳本 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

            使用這個(gè)腳本, Oracle 8可以以參數(shù) ``start''啟動,以 ``stop'' 參數(shù)停止。它符合init腳本的最小要求可以和 /etc/rc.d/rc腳本聯(lián)合使用。

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

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

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

            注意腳本中的兩行注釋:

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

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

            現(xiàn)在腳本在合適的位置,并且有合適的執(zhí)行權(quán)限,以及恰當(dāng)?shù)腸hkconfig注釋, 我們可以添加init腳本,作為 root,  

          #?chkconfig?--add?oracle.

            用 chkconfig的查詢,我們能核實(shí)我們所作的添加:

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

            而且,我們可以用標(biāo)準(zhǔn)的 find 命令察看chkconfig如何設(shè)定符號連接:

            [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)先權(quán)05而start連接包含80。如果你需要調(diào)整優(yōu)先權(quán), (e.g.我們停止的優(yōu)先權(quán)需要設(shè)為 03),簡單的調(diào)整oracle init腳本的chkconfig 注釋行并運(yùn)行 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中的改進(jìn)

            大家可能都知道了,inetd在 Red Hat 7中已經(jīng)被xinetd 所取代。而且,chkconfig 的功能已經(jīng)被擴(kuò)展,可以管理一些xinetd的Internet服務(wù)。例子如下:

            [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
            禁掉一個(gè) xinetd 服務(wù),可能是 finger,你應(yīng)該輸入:

            [root]#?chkconfig?finger?off.

            很簡捷啊,呵呵。可是,這里有個(gè)問題。當(dāng)配置已經(jīng)改變,命令/etc/init.d/xinetd reload指明xinetd 自動重載入新的配置,被 chkconfig執(zhí)行。這個(gè)腳本運(yùn)行一個(gè)帶有SIGUSR2信號的kill 指示 xinetd 進(jìn)行一個(gè)“硬“重配置。

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

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

            結(jié)論

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



          posted on 2006-07-28 18:02 奇葛格 閱讀(758) 評論(0)  編輯  收藏 所屬分類: Servers
          主站蜘蛛池模板: 左云县| 宝应县| 广平县| 西充县| 会泽县| 大余县| 渭源县| 宁夏| 剑阁县| 绥棱县| 嘉黎县| 苏州市| 奉新县| 黄山市| 柳江县| 彝良县| 子洲县| 宿州市| 纳雍县| 荆门市| 新昌县| 仙居县| 东城区| 武清区| 固原市| 稻城县| 阿巴嘎旗| 泉州市| 平遥县| 星座| 永泰县| 阿图什市| 福鼎市| 瓮安县| 清河县| 黑龙江省| 万盛区| 南充市| 潞西市| 外汇| 高密市|