Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150257
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-12 15:27
个人简介

文章分类

全部博文(14)

文章存档

2014年(14)

分类: LINUX

2014-03-03 14:52:51

    在大部分情况下,守护进程是长时间运行在系统中的。为项目提供一种服务,如vsftp,dnfs-server等等。所以很多时候都需要能够进行方便的管理,如简单的开启、关闭、重启命令,开启自启动。那么如何实现守护进程的管理呢?就像vsftp (start | stop | restart | status)一样?下面以前面的demo为例,介绍如何进行进程的管理及服务的开机启动。
一、进程管理
   在linux系统中,/etc/init.d目录下存放着系统安装的一些服务程序的管理脚本,里面包含了进程的开启、关闭、重启及状态查询。所以我们需要编写一个脚本放到/etc/init.d目录下进行进程的管理。下面是一个简单的管理代码,及相应的说明。

点击(此处)折叠或打开

  1. #!/bin/bash
  2. #
  3. #/etc/rc.d/init.d/sdaemon_log
  4. #
  5. # sdaemon_log This shell script takes care of starting and stopping sdaemon_log.
  6. #
  7. # description: sdaemon_log is the meta data server of demo.

  8. # Source function library
  9. # 引用其他脚本文件的函数
  10. if [ -f /etc/rc.d/init.d/functions ]; then
  11.     . /etc/rc.d/init.d/functions
  12. else
  13. . /lib/lsb/init-functions
  14. fi

  15. RETVAL=0
  16. prog="daemon_log"

  17. start()
  18.  {
  19.         # Start daemons.
  20.         echo -n "Starting $prog ..."
  21.         echo ""
  22.         [ -r /var/lock/$prog ] && echo $prog is started && return 0  # 建立文件,限制服务只运行一次
  23.         start_daemon /usr/local/bin/$prog   # daemon 化程序,运行程序
  24.         RETVAL=$?
  25.         echo
  26.         [ $RETVAL -eq 0 ] && touch /var/lock/$prog
  27.         return $RETVAL
  28. }

  29. stop()
  30.  {
  31.         # Stop daemons.
  32.         echo -n "Shutting down $prog ..."
  33.         echo ""
  34.         # killproc $prog
  35.         killall $prog   # 删除进程

  36.         RETVAL=$?
  37.         echo
  38.         [ $RETVAL -eq 0 ] && rm -f /var/lock/$prog    # 删除文件锁
  39.         return $RETVAL
  40. }


  41. status()
  42. {
  43.         [ -r /var/lock/$prog ] && echo $prog is started && return 0
  44.         echo $prog is stopped && return 0
  45. }
  46.  

  47. # See how we were called.
  48. case "$1" in
  49.   start)
  50.         start
  51.         ;;
  52.   stop)
  53.         stop
  54.         ;;
  55.   restart|reload)
  56.         stop
  57.         start
  58.         RETVAL=$?
  59.         ;;
  60.   status)
  61.         status
  62.         RETVAL=$?
  63.         ;;
  64.   *)
  65.         echo $"Usage: $0 {start|stop|restart|status}"
  66.         exit 1
  67. esac
  68. exit $RETVAL
有几点需要说明:
     1、引用其他脚本文件的函数,这里用了两个daemon、killproc。在redhat、centos等系统中,这两个函数存在于/etc/rc.d/init.d/functions文件中,而我测试的环境是ubuntu10.04,没有这个文件,所以引用了/lib/lsb/init-functions函数库。脚本开始处进行了判断。而且daemon函数名改成了start_daemon。(关于lsb脚本的更多知识,请询问度娘)
     2、一般的服务程序在本机中只提供一个副本,所以需要加入文件锁进行多次运行的控制。这个根据需要,有些服务可能需要提供多个副本。
     3、删除进程时,脚本引用的函数库中有killproc函数,原理是根据进程名删除进程,但是在我的测试环境中始终不能删除进程,所以使用了killall命令,达到了相同的效果,redhat可以使用killproc这个函数删除。
     4、将上面的脚本,拷贝到/etc/init.d目录下命名为sdaemon_log,并增加执行权限 sudo chmod +x sdaemon_log。可以进行进程维护了:
      sdaemon_log start
      sdaemon_log stop
      sdaemon_log restart
      sdaemon_log status
二、服务开机启动(ubuntu)
   将守护进程加入到开机启动的脚本中需要下面的命令(redhat及其他系统,请参照chkconfig的使用):
   sudo update-rc.d sdaemon_log defaults
   运行后结果:
   
    重启系统,daemon_log 就会随机启动了
   
   通过下面的命令可以进行管理服务的启动/结束.
          sudo service mongodb stop
          sudo service mongodb start
  
   服务的卸载通过sudo update-rc.d -f sdaemon_log remove 命令
   
阅读(2873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~