linux中注冊系統服務—service命令的原理通俗


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM