用紅帽子的chkconfig管理Init指令碼(轉)
用紅帽子的chkconfig管理Init指令碼(轉)[@more@]用紅帽子的chkconfig管理Init指令碼by Jimmy Ball翻譯:Feng Dahuifdh@163.net2001.12.11你的管理工具中多了個簡單但非常有用的東東。我喜歡發現新的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:processid 代表使用者定義的唯一的標誌,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 mode2. 多使用者,沒有NFS3. 完整的多使用者Complete multiuser mode4. 使用者自定義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:offapmd 0:off 1:off 2:on 3:off 4:on 5:off 6:offarpwatch 0:off 1:off 2:off 3:off 4:off 5:off 6:offatd 0:off 1:off 2:off 3:on 4:on 5:on 6:offautofs 0:off 1:off 2:off 3:off 4:off 5:off 6:offnamed 0:off 1:off 2:off 3:off 4:off 5:off 6:offbootparamd 0:off 1:off 2:off 3:off 4:off 5:off 6:offkeytable 0:off 1:off 2:on 3:on 4:on 5:on 6:offcrond 0:off 1:off 2:on 3:on 4:on 5:on 6:offsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:offnetfs 0:off 1:off 2:off 3:on 4:on 5:on 6:offnetwork 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<
>#chkconfig: 2345 80 05#description: Oracle 8 ServerORA_HOME=/usr/home/oracle/product/8.0.5ORA_OWNER=oracleif [ ! -f $ORA_HOME/bin/dbstart ]thenecho "Oracle startup: cannot start"exitficase "$1" in"start")su-$ORA_OWNER -c $ORA_HOME/bin/dbstartsu-$ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start";;"stop")su-$ORA_OWNER -c $ORA_HOME/bin/dbshutsu-$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 Serverchkconfig需要這些行來決定如何實現初始執行級新增服務,如何設定啟動和停止順序的優先順序 。這些行指明指令碼將為執行級2,3,4,5啟動 Oracle 8 服務。另外,啟動優先權將被設定為 80而停止優先權設定為05。現在指令碼在合適的位置,並且有合適的執行許可權,以及恰當的chkconfig註釋,我們可以新增init指令碼,作為 root,# chkconfig --add oracle.用 chkconfig的查詢,我們能核實我們所作的新增:[root]# chkconfig --list | grep oracleoracle 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/K03oracleRed Hat 7中的改進大家可能都知道了,inetd在 Red Hat 7種已經被xinetd 所取代。而且,chkconfig 的功能已經被擴充套件,可以管理一些xinetd的Internet服務。例子如下:[root]# chkconfig --list...xinetd based services:finger: onlinuxconf-web: offrexec: offrlogin: offrsh: offntalk: offtalk: offtelnet: ontftp: offwu-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指令碼的好處了,雖然它的功能似乎簡單了些,但是它節省時間,這使其成為一個系統管理員適用的命令,值得記牢
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用紅帽子的chkconfig管理Init指令碼指令碼
- Linux教程-用紅帽子的chkconfig管理Init指令碼(轉)Linux指令碼
- 紅帽子認證輔導教程(轉)
- CentOS的System V init啟動指令碼CentOS指令碼
- 龍芯轉型:摘掉紅帽子,要建生態系統
- 用chkconfig輕鬆管理啟動程式
- 求助:安裝紅帽子重引導後出現GRUB Hard Disk Error(轉)Error
- 實用的linux下指令碼!(轉)Linux指令碼
- 用於管理應用程式得shell指令碼指令碼
- U盤安裝Linux紅帽子6.4系統Linux
- DB2的一些管理用指令碼DB2指令碼
- 關於許可權管理的實用指令碼指令碼
- 解剖Nginx·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx指令碼變數
- 用oop的方法設計js指令碼 (轉)OOPJS指令碼
- 使用指令碼utlpwdmg.sql啟用密碼管理指令碼SQL密碼
- 在Linux 中用chkconfig輕鬆管理啟動程式(轉)Linux
- 應對紅色程式碼的六個實用方法 (轉)
- 精讀Nginx原始碼·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx原始碼指令碼變數
- IDAPython指令碼分享 - 自動在.preinit_array .init .init_array下斷點Python指令碼斷點
- Oracle 資料庫管理指令碼命名規範(轉)Oracle資料庫指令碼
- ORACLE DBA常用SQL指令碼工具->管理篇(1) (轉)OracleSQL指令碼
- 地址本的指令碼(轉)指令碼
- Day1: 用Github管理Pipeline指令碼Github指令碼
- BeanShell桌面---Java應用程式指令碼引擎 (轉)BeanJava指令碼
- Linux指令碼語言PERL 的模板應用分析(轉)Linux指令碼
- Linux管理指令碼之自動執行指令碼Linux指令碼
- Oracle管理指令碼介紹Oracle指令碼
- 指令碼新選擇——用C做指令碼指令碼
- 指令碼範例(轉)指令碼
- 平臺設計中的指令碼管理指令碼
- 【管理】Oracle 常用的V$ 檢視指令碼Oracle指令碼
- Windows XP 學用指令碼恢復系統的使用者密碼(轉)Windows指令碼密碼
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- 用樹型模型管理App數字和紅點提示(附原始碼Demo)模型APP原始碼
- 執行Shell指令碼的方式(轉)指令碼
- shutdown,halt,reboot,init(轉)boot
- 蘋果的帽子戲法蘋果
- 幾例實用的Shell指令碼指令碼