背景:Shell腳本是linux運維人員必備利器,怎麼樣把shell腳本安裝成服務且加入系統啟動,然後就可以使用服務來管理,這是一個很重要的問題。
當我們運行安裝服務的命令時候,假設服務名為myservice
#chkconfig --add myservice常常會出現
service myservice does not support chkconfig
下面講解正確方法:
1.1給服務腳本添加注釋。
#vim /etc/init.d/myservice
添加下面兩句到 #!/bin/bash 之後。
# chkconfig: 2345 10 90 # description: myservice .... 第一行告訴chkconfig缺省啟動的運行級以及啟動和停止的優先級。如果某服務缺 省不在任何運行級啟動,那麼使用 - 代替運行級。第二行對服務進行描述,可以 用\ 跨行注釋。其中2345是默認啟動級別,級別有0-6共7個級別。等級0表示:表示關機
等級1表示:單用戶模式
等級2表示:無網絡連接的多用戶命令行模式
等級3表示:有網絡連接的多用戶命令行模式
等級4表示:不可用
等級5表示:帶圖形界面的多用戶模式
等級6表示:重新啟動
10是啟動優先級,90是停止優先級,優先級范圍是0-100,數字越大,優先級越低。
1.2 服務腳本必須存放在/etc/ini.d/目錄下; 1.3 chkconfig --add servicename 在chkconfig工具服務列表中增加此服務,此時服務會被在/etc/rc.d/rcN.d中賦予K/S入口了; 1.4 chkconfig --level 2345 servicename on 修改服務的默認啟動等級。二、 另外還要注意幾個問題:
1)啟動腳本的標准結構:
case "$1" in start) do start-thing; ;; stop) do stop-thing; ;; restart) do restart-thing; ;; ... esac 你如果按這種結構寫個啟動腳本測試一下就會發現,若該腳本的軟連接以S開頭,則系統啟動的時候 執行start-thing代碼段,若該腳本的軟連接以K開頭的話,則系統啟動時執行stop-thing代碼段 (有一點兒例外的是運行級別0,因為0級別是關閉系統,所以/etc/rc0.d/下的以S開頭的軟連接 也執行stop-thing段)。是不是很智能化,所以如果可以的話啟動腳本最好寫標准一些。如果你非 寫成普通的腳本,就幾個命令,沒有上面那個結構,建立以K或S開頭的軟連接會怎麼執行呢? 答案是全部執行。 2)chkconfigchkconfig命令主要用來更新(啟動或停止)和查詢系統服務的運行級信息。謹記chkconfig不是立即自動禁止或激活一個服務,它只是簡單的改變了符號連接。使用語法:
chkconfig [--add][--del][--list][系統服務] 或 chkconfig[--level <等級代號>][系統服務][on/off/reset]
chkconfig在沒有參數運行時,顯示用法。如果加上服務名,那麼就檢查這個服務是否 在當前運行級啟動。如果是,返回true,否則返回false。如果在服務名後面指定了on,off或者reset,那麼chkconfig 會改變指定服務的啟動信息。on和off分別指服務被啟動和停止,reset指重置服務的啟動信息,無論有問題的初始化腳本指定了什麼。on和off開關,系統默認只對運行級3,4,5有效,但是reset可以對所有運行級有效。
使用范例:
chkconfig --list #列出所有的系統服務
chkconfig --add httpd #增加httpd服務
chkconfig --del httpd #刪除httpd服務
chkconfig --level httpd 2345 on #設置httpd在運行級別為2、3、4、5的情況下都是on(開啟)的狀態
chkconfig --list #列出系統所有的服務啟動情況
chkconfig --list mysqld #列出mysqld服務設置情況
chkconfig --level 35 mysqld on #設定mysqld在等級3和5為開機運行服務,--level35表示操作只在等級3和5執行,on表示啟動,off表示關閉
chkconfig mysqld on #設定mysqld在各等級為on,“各等級”包括2、3、4、5等級
/etc目錄下有一組rc開頭目錄,它們用來存放在各個運行級別下linux自動啟動的服務:
/etc/rc0.d/ #運行模式0下需要啟動的服務
/etc/rc1.d/ #運行模式1下需要啟動的服務
/etc/rc2.d/ #運行模式2下需要啟動的服務
/etc/rc3.d/ #運行模式3下需要啟動的服務
/etc/rc4.d/ #運行模式4下需要啟動的服務
/etc/rc5.d/ #運行模式5下需要啟動的服務
/etc/rc6.d/ #運行模式6下需要啟動的服務
這些目錄中除README說明文檔之外放的都是些軟鏈接(符號鏈接),這些鏈接指向各服務的進程管理腳本,而這些進程管理腳本都放在/etc/init.d目錄中.
用chkconfig命令操作的添加或者刪除開機自動啟動服務程序,其實就是創建或刪除這些目錄中的軟鏈接. 每個軟鏈接的命名都是"大寫S+運行順序+腳本名稱",裡面有一個鏈接是"S20rc.local -> ../init.d/rc.local".打開它指向的腳本/etc/init.d/rc.local看一下,發現它裡面調用了/etc/rc.local這個腳本.原來/etc/rc.local中的命令是在這兒執行的.
如果把mysql服務的啟動命令放進/etc/rc.local中,操作系統也會在執行這個列表的時候執行它,不過它的執行順序是20,比排在前面的S17mysql還要晚一些~
chconfig --level 2345 puppet off 等價於 chkconfig puppet off (不用--level 指定級別時,默認是2345)
這條命令是設置 puppet 服務在 2345級別不自動啟動,當執行這條命令時,會在
rc2.d rc3.d rc4.d rc5.d 這幾個目錄新建軟連接K02puppet 從 /etc/rc.d/init/puppet 腳本
chkconfig puppet on 這個就是在2345級別時,開機自動啟動
當執行這條命令時,會在
rc2.d rc3.d rc4.d rc5.d 這幾個目錄新建軟連接S98puppet 從 /etc/rc.d/init/puppet 腳本
那這個 K02puppet S98puppet 中的 02 和 98 是怎麼來的?
打開/etc/rc.d/init.d/puppet這個腳本文件,看前幾行 如下:
#!/bin/bash
# puppet Init script for running the puppetclient daemon
#
# Author: Duane Griffin
# David Lutterkort
#
# chkconfig: - 98 02
#
# description: Enables periodic systemconfiguration checks through puppet.
# processname: puppet
# config: /etc/sysconfig/puppet
特別是這行
# chkconfig: - 98 02
chkconfig 命令會讀取這一行,來獲取運行級別和那2個數字的,在這個腳本裡面
本文出自 “技術成就夢想” 博客,請務必保留此出處http://pizibaidu.blog.51cto.com/1361909/1795909