(轉)linux中註冊系統服務—service命令的原理通俗__linux

來源:互聯網
上載者:User

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



原文地址:

http://www.cnblogs.com/wangtao_20/archive/2014/04/04/3645690.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.