能夠使用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的前提條件。