Linux中将memcached注册为系统服务

引言:

memcached是优秀的开源高性能分布式内存对象缓存系统。在Linux系统下编译安装后没有自动注册为系统服务。另外由于memcached基于libevent库,该库默认的编译安装位置为/usr/local/lib目录,该目录又不是多数linux发行版的默认库加载路径。因此在执行memcached之前需要修改默认加载路径,将该路径包含进去。虽然只需要设置一次但毕竟要设置,很麻烦。如果你又希望存放在该路径下的库不被程序自动搜寻到,就不能使用该方法。那么怎么才能有个完全的方法来解决呢?

解决方法:

既然memcached没有被注册为系统服务,那我们手动地去注册。注册系统服务需要编写启动脚本,一般要实现三个方法,分别是:start、stop和restart。并且该脚本要放置在/etc/init.d/目录中。下面是我写的服务脚本(脚本需要以root权限编写):

[python] view plaincopy
  1. #chkconfig:3456060
  2. #description:ThisServiceisfrommemcached\
  3. #whichishighperformanceobjectcachesystem
  4. #!/bin/sh
  5. exportLD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  6. memcached_process_name="memcached"
  7. start(){
  8. echo"StartingMemcachedServicewithPort11211"
  9. #notethatthecharacter`isnotsinglequotation,\
  10. #Itistheleftcharacterof"1"keyinyourkeyboard
  11. memcached_pid_list=`pidof$memcached_process_name`
  12. iftest-n"$memcached_pid_list"
  13. then
  14. echo"FailToLaunchMemcached,SinceItHasAlreadyStarted"
  15. exit1
  16. else
  17. echo"LaunchingmemcachedwithMaxMemory64MB"
  18. /usr/local/bin/memcached-l0.0.0.0-p11211-m64-d-uroot
  19. echo"LaunchMemcachedSuccessfully"
  20. exit0
  21. fi;
  22. }
  23. stop(){
  24. echo"StoppingMemcachedService..."
  25. memcached_pid_list=`pidof$memcached_process_name`
  26. iftest-n"$memcached_pid_list"
  27. then
  28. echo"FindMemcachedProcess(es),StartToEndThem"
  29. kill-9$memcached_pid_list
  30. iftest"$?"="0"
  31. then
  32. echo"SuccesstoTerminateAllMemcachedProcesses"
  33. else
  34. echo"CanNotTerminateAllMemcachedProcesses"
  35. fi;
  36. echo{1}quot;FinishedStoppingMemcachedService"
  37. exit0
  38. else
  39. echo"CanNotFindAnyMemcachedProcess,FailToStopService"
  40. exit1
  41. fi;
  42. }
  43. case"$1"in
  44. start)
  45. start
  46. ;;
  47. stop)
  48. stop
  49. ;;
  50. restart)
  51. stop
  52. #sleep3secondstowaitforprocess'sexit
  53. sleep3
  54. start
  55. ;;
  56. *)
  57. echo{1}quot;Usage:$0{start|stop|restart}"
  58. exit2
  59. esac

编写完毕后。对其赋予755权限,即rwxr-xr-x(文件所有者具有读写执行权限,同组用户具有只读和执行权限,其他用户具有只读和执行权限):

  1. [[email protected]]#chmod755memcached

脚本中指定了memcached监听本地所有IP,端口为TCP的11211端口,默认为其分配64M的内存,如果想修改这些值,需要修改上面的配置文件start函数的如下两行:

  1. echo"LaunchingmemcachedwithMaxMemory64MB"
  2. /usr/local/bin/memcached-l0.0.0.0-p11211-m64-d-uroot

具体参数意义请参阅memcache的手册man memcached。

手动启动、停止和重启服务命令为

service memcached start

service memcached stop

service memcached restart

虽然编写了脚本,但是现在还不能让系统自动加载服务,接下来:

在上述脚本中注意开始的三行:

[python] view plaincopy
  1. #chkconfig:3456060
  2. #description:ThisServiceisfrommemcached\
  3. #whichishighperformanceobjectcachesystem

#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)。

要想让服务随系统启动,需要安装服务:

  1. [[email protected]]#chkconfig--addmemcached

此时查看系统的服务中就会有自己注册的服务了:

  1. [[email protected]]#chkconfig--list
  2. ...
  3. mdmpd0:off1:off2:off3:off4:off5:off6:off
  4. memcached0:off1:off2:off3:on4:on5:on6:off
  5. messagebus0:off1:off2:off3:on4:on5:on6:off
  6. ...


(2011年11月23日补充)

如果你使用的是Red Hat系列的Linux发行版(包括Red Hat Enterprise Linux、CentOS和Fedora),并且安装了图形化界面,在系统自带的服务配置工具(Service Configuration)中可以直接看到当前已安装的各项服务:

Linux中将memcached注册为系统服务

下面我们选中一项系统默认安装的acpid服务,看到右边有status区域,表示当前服务的状态。Linux中将memcached注册为系统服务

而如果我们选择自己写的memcached服务项,在这一栏显示的是:Usage:/etc/init.d/memcached {start|stop|restart}。

根据我的尝试,需要在脚本中实现可处理status参数。对于这个服务配置工具来说,启动时会向所有服务脚本调用带status参数的命令。例如:service memcached status。然后拦截标准输出,并将输出文本放于此区域。只要你根据自己的需要实现status参数的处理就可以了。

至于pid表示的是进程ID。在Linux系统中可以通过读取pid文件来获取该值。memcached支持在启动后生成pid文件。方法是在启动参数后加入:

-P [pid文件]

即可。例如: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


引言:

memcached是优秀的开源高性能分布式内存对象缓存系统。在Linux系统下编译安装后没有自动注册为系统服务。另外由于memcached基于libevent库,该库默认的编译安装位置为/usr/local/lib目录,该目录又不是多数linux发行版的默认库加载路径。因此在执行memcached之前需要修改默认加载路径,将该路径包含进去。虽然只需要设置一次但毕竟要设置,很麻烦。如果你又希望存放在该路径下的库不被程序自动搜寻到,就不能使用该方法。那么怎么才能有个完全的方法来解决呢?

解决方法:

既然memcached没有被注册为系统服务,那我们手动地去注册。注册系统服务需要编写启动脚本,一般要实现三个方法,分别是:start、stop和restart。并且该脚本要放置在/etc/init.d/目录中。下面是我写的服务脚本(脚本需要以root权限编写):

[python] view plaincopy
  1. #chkconfig:3456060
  2. #description:ThisServiceisfrommemcached\
  3. #whichishighperformanceobjectcachesystem
  4. #!/bin/sh
  5. exportLD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  6. memcached_process_name="memcached"
  7. start(){
  8. echo"StartingMemcachedServicewithPort11211"
  9. #notethatthecharacter`isnotsinglequotation,\
  10. #Itistheleftcharacterof"1"keyinyourkeyboard
  11. memcached_pid_list=`pidof$memcached_process_name`
  12. iftest-n"$memcached_pid_list"
  13. then
  14. echo"FailToLaunchMemcached,SinceItHasAlreadyStarted"
  15. exit1
  16. else
  17. echo"LaunchingmemcachedwithMaxMemory64MB"
  18. /usr/local/bin/memcached-l0.0.0.0-p11211-m64-d-uroot
  19. echo"LaunchMemcachedSuccessfully"
  20. exit0
  21. fi;
  22. }
  23. stop(){
  24. echo"StoppingMemcachedService..."
  25. memcached_pid_list=`pidof$memcached_process_name`
  26. iftest-n"$memcached_pid_list"
  27. then
  28. echo"FindMemcachedProcess(es),StartToEndThem"
  29. kill-9$memcached_pid_list
  30. iftest"$?"="0"
  31. then
  32. echo"SuccesstoTerminateAllMemcachedProcesses"
  33. else
  34. echo"CanNotTerminateAllMemcachedProcesses"
  35. fi;
  36. echo{1}quot;FinishedStoppingMemcachedService"
  37. exit0
  38. else
  39. echo"CanNotFindAnyMemcachedProcess,FailToStopService"
  40. exit1
  41. fi;
  42. }
  43. case"$1"in
  44. start)
  45. start
  46. ;;
  47. stop)
  48. stop
  49. ;;
  50. restart)
  51. stop
  52. #sleep3secondstowaitforprocess'sexit
  53. sleep3
  54. start
  55. ;;
  56. *)
  57. echo{1}quot;Usage:$0{start|stop|restart}"
  58. exit2
  59. esac

编写完毕后。对其赋予755权限,即rwxr-xr-x(文件所有者具有读写执行权限,同组用户具有只读和执行权限,其他用户具有只读和执行权限):

  1. [[email protected]]#chmod755memcached

脚本中指定了memcached监听本地所有IP,端口为TCP的11211端口,默认为其分配64M的内存,如果想修改这些值,需要修改上面的配置文件start函数的如下两行:

  1. echo"LaunchingmemcachedwithMaxMemory64MB"
  2. /usr/local/bin/memcached-l0.0.0.0-p11211-m64-d-uroot

具体参数意义请参阅memcache的手册man memcached。

手动启动、停止和重启服务命令为

service memcached start

service memcached stop

service memcached restart

虽然编写了脚本,但是现在还不能让系统自动加载服务,接下来:

在上述脚本中注意开始的三行:

[python] view plaincopy
  1. #chkconfig:3456060
  2. #description:ThisServiceisfrommemcached\
  3. #whichishighperformanceobjectcachesystem

#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)。

要想让服务随系统启动,需要安装服务:

  1. [[email protected]]#chkconfig--addmemcached

此时查看系统的服务中就会有自己注册的服务了:

  1. [[email protected]]#chkconfig--list
  2. ...
  3. mdmpd0:off1:off2:off3:off4:off5:off6:off
  4. memcached0:off1:off2:off3:on4:on5:on6:off
  5. messagebus0:off1:off2:off3:on4:on5:on6:off
  6. ...


(2011年11月23日补充)

如果你使用的是Red Hat系列的Linux发行版(包括Red Hat Enterprise Linux、CentOS和Fedora),并且安装了图形化界面,在系统自带的服务配置工具(Service Configuration)中可以直接看到当前已安装的各项服务:

Linux中将memcached注册为系统服务

下面我们选中一项系统默认安装的acpid服务,看到右边有status区域,表示当前服务的状态。Linux中将memcached注册为系统服务

而如果我们选择自己写的memcached服务项,在这一栏显示的是:Usage:/etc/init.d/memcached {start|stop|restart}。

根据我的尝试,需要在脚本中实现可处理status参数。对于这个服务配置工具来说,启动时会向所有服务脚本调用带status参数的命令。例如:service memcached status。然后拦截标准输出,并将输出文本放于此区域。只要你根据自己的需要实现status参数的处理就可以了。

至于pid表示的是进程ID。在Linux系统中可以通过读取pid文件来获取该值。memcached支持在启动后生成pid文件。方法是在启动参数后加入:

-P [pid文件]

即可。例如: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