linux下將程序註冊成服務,設置開機自啓

註冊成服務一般是有兩種方式:

  • 在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的前提條件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章