Linux中將memcached註冊為系統服務 .
Linux中將memcached註冊為系統服務 .
引言:
memcached是優秀的開源高性能分散式內存對象緩存系統。在Linux系統下編譯安裝后沒有自動註冊為系統服務。另外由於memcached基於libevent庫,該庫默認的編譯安裝位置為/usr/local/lib目錄,該目錄又不是多數linux發行版的默認庫載入路徑。因此在執行memcached之前需要修改默認載入路徑,將該路徑包含進去。雖然只需要設置一次但畢竟要設置,很麻煩。如果你又希望存放在該路徑下的庫不被程序自動搜尋到,就不能使用該方法。那麼怎麼才能有個完全的方法來解決呢?
解決方法:
既然memcached沒有被註冊為系統服務,那我們手動地去註冊。註冊系統服務需要編寫啟動腳本,一般要實現三個方法,分別是:start、stop和restart。並且該腳本要放置在/etc/init.d/目錄中。下面是我寫的服務腳本(腳本需要以root許可權編寫):view plaincopy to clipboardprint?
01.#chkconfig: 345 60 60
02.#description: This Service is from memcached \
03.# which is high performance object cache system
04.#!/bin/sh
05.export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
06.memcached_process_name="memcached"
07.start(){
08. echo "Starting Memcached Service with Port 11211"
09. # note that the character ` is not single quotation, \
10. # It is the left character of "1" key in your keyboard
11. memcached_pid_list=`pidof $memcached_process_name`
12. if test -n "$memcached_pid_list"
13. then
14. echo "Fail To Launch Memcached, Since It Has Already Started"
15. exit 1
16. else
17. echo "Launching memcached with MaxMemory 64MB"
18. /usr/local/bin/memcached -l 0.0.0.0 -p 11211 -m 64 -d -u root
19. echo "Launch Memcached Successfully"
20. exit 0
21. fi;
22.}
23.
24.stop(){
25. echo "Stopping Memcached Service..."
26. memcached_pid_list=`pidof $memcached_process_name`
27. if test -n "$memcached_pid_list"
28. then
29. echo "Find Memcached Process(es), Start To End Them"
30. kill -9 $memcached_pid_list
31. if test "$?" = "0"
32. then
33. echo "Success to Terminate All Memcached Processes"
34. else
35. echo "Can Not Terminate All Memcached Processes"
36. fi;
37. echo {1}quot;Finished Stopping Memcached Service"
38. exit 0
39. else
40. echo "Can Not Find Any Memcached Process, Fail To Stop Service"
41. exit 1
42. fi;
43.}
44.
45.
46.case "$1" in
47. start)
48. start
49. ;;
50. stop)
51. stop
52. ;;
53. restart)
54. stop
55. #sleep 3 seconds to wait for process's exit
56. sleep 3
57. start
58. ;;
59. *)
60. echo {1}quot;Usage:$0 {start|stop|restart}"
61. exit 2
62.esac
#chkconfig: 345 60 60
#description: This Service is from memcached \
# which is high performance object cache system
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
memcached_process_name="memcached"
start(){
echo "Starting Memcached Service with Port 11211"
# note that the character ` is not single quotation, \
# It is the left character of "1" key in your keyboard
memcached_pid_list=`pidof $memcached_process_name`
if test -n "$memcached_pid_list"
then
echo "Fail To Launch Memcached, Since It Has Already Started"
exit 1
else
echo "Launching memcached with MaxMemory 64MB"
/usr/local/bin/memcached -l 0.0.0.0 -p 11211 -m 64 -d -u root
echo "Launch Memcached Successfully"
exit 0
fi;
}
stop(){
echo "Stopping Memcached Service..."
memcached_pid_list=`pidof $memcached_process_name`
if test -n "$memcached_pid_list"
then
echo "Find Memcached Process(es), Start To End Them"
kill -9 $memcached_pid_list
if test "$?" = "0"
then
echo "Success to Terminate All Memcached Processes"
else
echo "Can Not Terminate All Memcached Processes"
fi;
echo {1}quot;Finished Stopping Memcached Service"
exit 0
else
echo "Can Not Find Any Memcached Process, Fail To Stop Service"
exit 1
fi;
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
#sleep 3 seconds to wait for process's exit
sleep 3
start
;;
*)
echo {1}quot;Usage:$0 {start|stop|restart}"
exit 2
esac 編寫完畢后。對其賦予755許可權,即rwxr-xr-x(文件所有者具有讀寫執行許可權,同組用戶具有隻讀和執行許可權,其他用戶具有隻讀和執行許可權):
view plaincopy to clipboardprint?
01.# chmod 755 memcached
# chmod 755 memcached
腳本中指定了memcached監聽本地所有IP,埠為TCP的11211埠,默認為其分配64M的內存,如果想修改這些值,需要修改上面的配置文件start函數的如下兩行:view plaincopy to clipboardprint?
01.echo "Launching memcached with MaxMemory 64MB"
02./usr/local/bin/memcached -l 0.0.0.0 -p 11211 -m 64 -d -u root
echo "Launching memcached with MaxMemory 64MB"
/usr/local/bin/memcached -l 0.0.0.0 -p 11211 -m 64 -d -u root具體參數意義請參閱memcache的手冊man memcached。
手動啟動、停止和重啟服務命令為service memcached start
service memcached stop
service memcached restart雖然編寫了腳本,但是現在還不能讓系統自動載入服務,接下來:
在上述腳本中注意開始的三行:
view plaincopy to clipboardprint?
01.#chkconfig: 345 60 60
02.#description:This Service is from memcached \
03.# which is high performance object cache system
#chkconfig: 345 60 60
#description:This Service is from memcached \
# which is high performance object cache system
#chkconfig和#description是必須要有的。chkconfig后的第一段數字:345,表示在那些運行界別中會開啟此服務。當Linux系統以指定的運行級別來運行時,進入系統會自動調用服務的start;當Llinux系統以非指定的運行級別來運行時,進入系統后自動調用服務的stop來阻止服務啟動。
運行級別有7個等級:
等級0表示:表示關機
等級1表示:單用戶模式
等級2表示:無網路連接的多用戶命令行模式
等級3表示:有網路連接的多用戶命令行模式
等級4表示:不可用
等級5表示:帶圖形界面的多用戶模式
等級6表示:重新啟動
由於memcached在工作時需要使用網路連接,所以最低級別要在3才能正常工作。
chkconfig后的第二段數字:60,表示該服務在系統進入指定運行級別後的啟動順序。這樣來說可能看不懂。舉個例子,上面的腳本被設置為3、4、5級別啟用,則服務管理工具會在/etc/rc3.d、/etc/rc4.d、/etc/rc5.d以及/etc/rc.d/rc3.d、/etc/rc.d/rc4.d、/etc/rc.d/rc5.d中分別創建名稱為S60memcached的映射(命名規則:S[數字][服務名]。S表示Startup,即「啟動」),映射的目標為/etc/init.d/memcached(即本文件)。系統在啟動后就已知在以何種級別運行,因此系統會試圖執行對應級別的目錄內所有以S開頭的腳本,並且加上start參數。至於執行的順序,就靠S後邊的編號了。編號數值越大越后被執行(00~99)。
chkconfig后的第三段數字:60,表示該服務在系統進入非指定運行等級后的關閉順序。這樣來說可能還是看不懂。還是上面的例子,上面的腳本被設置為3、4、5級別啟用,Linux一共有7個運行級別。則服務管理工具會在餘下的/etc/rc0.d、/etc/rc1.d、/etc/rc2.d、/etc/rc6.d以及/etc/rc.d/rc0.d、/etc/rc.d/rc1.d、/etc/rc.d/rc2.d、/etc/rc.d/rc6.d中分別創建名稱為K60memcached的映射(命名規則:K[數字][服務名]。K表示Kill,即「殺死」),系統在啟動后就已知在以何種級別運行,系統除了會執行對應級別的目錄內所有以S開頭的腳本外,還會執行以K開頭的腳本,但是對於這樣的腳本會加上stop參數來執行。至於執行的順序,就靠K後邊的編號了。編號數值越小越后被執行(99~00)。
要想讓服務隨系統啟動,需要安裝服務:view plaincopy to clipboardprint?
01.# chkconfig --add memcached
# chkconfig --add memcached 此時查看系統的服務中就會有自己註冊的服務了:view plaincopy to clipboardprint?
01.# chkconfig --list
02....
03.mdmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
04.memcached 0:off 1:off 2:off 3:on 4:on 5:on 6:off
05.messagebus 0:off 1:off 2:off 3:on 4:on 5:on 6:off
06....
# chkconfig --list
...
mdmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
memcached 0:off 1:off 2:off 3:on 4:on 5:on 6:off
messagebus 0:off 1:off 2:off 3:on 4:on 5:on 6:off
... 如果你使用的是Red Hat系列的Linux發行版(包括Red Hat Enterprise Linux、CentOS和Fedora),並且安裝了圖形化界面,在系統自帶的服務配置工具(Service Configuration)中可以直接看到當前已安裝的各項服務:
下面我們選中一項系統默認安裝的acpid服務,看到右邊有status區域,表示當前服務的狀態。
而如果我們選擇自己寫的memcached服務項,在這一欄顯示的是:Usage:/etc/init.d/memcached {start|stop|restart}。
根據我的嘗試,需要在腳本中實現可處理status參數。對於這個服務配置工具來說,啟動時會向所有服務腳本調用帶status參數的命令。例如:service memcached status。然後攔截標準輸出,並將輸出文本放於此區域。只要你根據自己的需要實現status參數的處理就可以了。
至於pid表示的是進程ID。在Linux系統中可以通過讀取pid文件來獲取該值。memcached支持在啟動後生成pid文件。方法是在啟動參數后加入:
-P
即可。例如:memcached -l 0.0.0.0 -p 11211 -u root -P /usr/local/bin/memcached.pid。
參考文獻:
chkconfig添加腳本,http://www.nginxs.com/linux/183.html
Linux下chkconfig命令詳解,http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html
《解決方案》
chkconfig -a "服務名"