註冊成服務一般是有兩種方式:
- 在usr/lib/systemd/system下新建 服務名.service ,編輯腳本
- 在etc/init.d下新建服務,編輯腳本
這兩種方式在我其他的文章中都有提到過,今年主要分析一下第二種方式的原理
能夠使用service命令進行操作的,就是已經註冊成爲linux的系統服務了。window中也可以註冊成爲系統服務的辦法。
service命令用的次數真不少,就是比較多的關聯點,用了很多次了,還是有些地方沒打通,雲裏霧裏的。所以才梳理一下這個技術知識點,理順思路。此時我覺得,很有必要理解service命令的原理性知識了。
瞭解service命令的來龍去脈,在解決實際問題中的幫助,結合實際應用,我對以下問題有幫助:
1、如果從網上下載一個新的軟件,安裝到linux上面去。想註冊成系統服務,我需要自己編寫一個shell腳本文件才行。這個腳本文件如何編寫呢?如果不瞭解servcie命令的機制。會漏掉一些東西了。比如我之前下載的sphinx安裝到服務器後。我想使用"service sphinx start"這樣的簡短命令來管理,就必須註冊成爲系統服務。而源碼包中是沒有提供寫好的腳本的。必須自己寫一個。
知道了來龍去脈,可以減少依賴。像niginx、mysql我們都可以自己編寫供servcie調用的腳本文件。
2、使用chkconfig的先決條件。如果要進一步使用"chkconfig --level 3456 sphinx"來自由控制開啓和關閉,那麼前提必須實現有供調用的腳本文件(也就是這個服務要是系統服務可以讓service調用)
以"爲什麼要註冊成爲service服務"的角度來理解,這樣做的好處是什麼,從這裏展開來理解。
把一個程序(比如mysql、apache等)註冊成系統服務的好處,通俗點理解我覺得包括兩個方面:
1、可以使用"service 服務名稱"來進行管理,比如常常使用的命令”service httpd start”,就是httpd註冊成爲一個服務了,於是纔不需要寫一大串的原始服務路徑。
像sphinx的啓動手工方式爲:”/data/installsoft/sphinx-for-chinese/bin/searchd –c 配置文件”
將sphinx註冊成爲系統服務後,就可以像"service sphinx start"來啓動。
注:sphinx是一個全文搜索服務。爲方便理解,可以換成是mysql、apache也行。
把”service sphinx”看成等價於"/data/installsoft/sphinx-for-chinese/bin/searchd"也可以。
關聯要點
要把一個程序註冊成系統服務,首先得給出一個供service命令調用的腳本文件放到目錄"/etc/rc.d/init.d/"中去。
/etc/rc.d/init.d/這個目錄下其實就是很多腳本文件。看下面的截圖,就是我服務器上列出的文件(其實都是一些shell腳本文件)
現在疑問:這個腳本文件是一個shell文件,假設要自己編寫這個腳本,裏面要編寫什麼樣的內容呢?
聯想一下常常使用的命令:service httpd start、service httpd stop。
註冊成系統服務是方便類似上面這樣子調用。那麼編寫的shell腳本只要處理接受start參數應該幹嘛,接收stop參數應該幹嘛。
實際上,腳本的內容是完全可以按照自己需要來編寫。比如我在管理sphinx的時候。我需要重建索引,直接傳遞一個reindex參數就可以重建:”service sphinx reindex”。
通俗點的理解方式
我習慣於將”service httpd start” 將httpd理解成目錄/etc/rc.d/init.d/下的腳本文件httpd(腳本文件與服務名稱是同名的),所以service httpd就是去調用/etc/rc.d/init.d/下的腳本文件httpd。
而後面接着的start,則是向/etc/rc.d/init.d/httpd傳遞一個start參數。歸納一下如下:
service httpd 等價 /etc/rc.d/init.d/httpd
service httpd start 等價 /etc/rc.d/init.d/httpd start
service httpd stop 等價 /etc/rc.d/init.d/httpd stop
注:httpd是一個shell腳本
具體接到這個start參數該如何處理,你愛幹嘛就幹嘛,你完全可以停掉服務,也可以啓動服務。只是按照我們習慣,都是啓動服務。
我一般理解”service httpd start “ 命令執行的時候,會去目錄”/etc/rc.d/init.d/”目錄下尋找一個httpd的腳本文件。有同名文件,就表示服務存在,沒有會提示服務不存在。可以試一下使用一個文件名不存在的服務:service jgj start,看看會提示什麼信息。
其實就是jgj這個文件不存在。在這個目錄裏面創建一個jgj文件,就不會告訴你,服務不存在。所以服務存在的條件是同名文件存在,哈哈。
這個時候不會提示服務不存在,是沒有執行權限
增加一下執行權限,chmod +x jgj
這個時候會執行jgj腳本文件裏面的命令,裏面是什麼就執行什麼,語法錯了就報錯。
具體例子:sphinx註冊成系統服務
原來我啓動sphinx服務的命令爲 “/data/install/sphinx-for-chinese/bin/searchd –c /data/install/sphinx-for-chinese/ect/shpinx.conf”
重建sphinx中的索引的命令爲 “/data/install/sphinx-for-chinese/bin/indexer –c –c /data/install/sphinx-for-chinese/ect/shpinx.conf --all --rotate”
實在太長了,其他不用管是幹嘛的,只需要知道–c表示配置文件位置,它後面的值爲” /data/install/sphinx-for-chinese/ect/shpinx.conf”
如果我每次都需要這樣子來操作,敲命令確實繁瑣了。把sphinx加到系統服務中去。
可以使用”service sphinx start”、”service sphinx reindex”很簡短的命令來替代上面一大串。
大體意思是,把上面一大串啓動的命令和重建索引的命令都放到了/etc/rc.d/init.d/sphinx這個腳本文件中去了(爲了通俗點才這麼說,當然不是簡單複製進去就可以,還要接收start、reindex這些參數)
下面是我用在服務器上名sphinx腳本文件(/etc/rc.d/init.d/sphinx)
# !/bin/bash
# chkconfig: - 85 15
# description: sphinx-for-chinese service
#processname:sphinx
ROOT_PATH=/data/installsoft/sphinx-for-chinese
case "$1" in
start)
echo "Starging sphinx Server..."
$ROOT_PATH/bin/searchd -c $ROOT_PATH/etc/sphinx.conf
;;
stop)
echo "Stopping sphinx Server..."
$ROOT_PATH/bin/searchd --stop
;;
restart)
$ROOT_PATH/bin/searchd --stop
$ROOT_PATH/bin/searchd -c $ROOT_PATH/etc/sphinx.conf
;;
reindex)
echo "reindexing..."
$ROOT_PATH/bin/indexer -c $ROOT_PATH/etc/sphinx.conf --all --rotate
;;
*)
echo "Usage: $0 {start|stop|restart|reindex}"
exit 1
;;
esac
exit 0
解釋:上面用了case語法。可以看到接收start參數進來的時候,執行的是:$ROOT_PATH/bin/searchd -c $ROOT_PATH/etc/sphinx.conf
以後我還需要增加一些 操作項,比如servcie sphinx kill,那麼在腳本中繼續添加一段接收kill參數的處理代碼即可了。寫到這裏,我更加理解註冊成爲系統服務管理上的方便之處。
2、註冊成系統服務,還有一個好處。可以使用chkconfig命令來控制運行級別。也就是控制什麼級別下面是開啓還是運行。
chkconfig –level sphinx 3456
這個命令是設置在3、4、5、6運行級別下sphinx服務(也就是/etc/rc.d/init.d/sphinx這個腳本)是啓動狀態。
我以前就比較納悶,既然都是使用到/etc/rc.d/init.d/下的腳本文件。這個腳本文件內容完全是自己編寫的,裏面內容不一定有啓動命令啊。如何使得chkconfig就可以開機啓動服務了呢?
每個啓動級別在/etc/rc.d/下是有一個單獨的目錄:rc0.d、rc1.d………rc6.d
直到從某個資料中下面介紹:
S開始的文件向腳本傳遞start參數
K開始的文件向腳本傳遞stop參數
看到上面的話,頓時理解了。原來,向/etc/rc.d/init.d/sphinx傳遞start和stop參數來實現了。一句話:chkconfig配置的S85sphinx這些文件實際上就是傳遞一個參數給腳本文件/ect/rc.d/init.d/sphinx。這樣很通俗的明白了。chkconfig來開機啓動機制了,在開機的時候,傳遞參數給腳本文件。
那麼現在明白,自己編寫的服務腳本,也必須實現接受start和stop兩個參數的處理才行。
service與chkconfig的關係歸納爲:
先要註冊成爲系統服務(即service可以調用),然後才能使用chkconfig控制運行級別。
service是chkconfig的前提條件。