Linux中將memcached註冊為系統服務 .

火星人 @ 2014-03-03 , reply:0


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 "服務名"




[火星人 via ] Linux中將memcached註冊為系統服務 .已經有200次圍觀

http://www.coctec.com/docs/service/show-post-1638.html