zoukankan      html  css  js  c++  java
  • daemontools检测进程,退出拉起

    一、学习的原因:

          为了实现在服务异常停止运行后,有一个监控程序能监控到它,并自动重新启动这个服务。以下以tomcat为例子

    二、工具supervise

          Daemontools是一个包含了很多管理Unix服务的工具的软件包。其中最核心的工具是supervise,它的功能是监控一个指定的服务,当该服务进程消亡,则重新启动该进程。而要添加让supervise监控的服务非常容易,只需要添加一个被监控的服务的目录,在该目录中添加启动服务器的名字为run的脚本文件即可。
        其中svscan工具是为指定的工作目录(缺省是/service/目录)下的所有子目录中的每一个子目录都启动一个supervise进程,最多可以启动多达1000个supervise进程(也就是工作目录下可以有多达1000个子目录)。其中每个子目录下都会有一个名为run的用来启动对应服务的脚本程序。Supervise会监控该服务,在服务消亡时使用run脚本来自动启动该服务。若svscan的工作目录下的子目录的sticky位被置位,则svscan将为该子目录启动两个supervise进程,一个监控子目录中的run对应的服务,另外一个监控子目录下的log子目录的记录服务,两者之间通过管道来相互联系。
        Svscan每5秒钟检测一次子目录,若出现新的目录则为该目录启动supervise,若某个老的子目录对应的supervise退出,则重新启动它。
        该软件包的所有工具的详细信息请参考在线文档。daemontools最经典的搭配是和lighttpd一起使用

    三、安装

      /pacakage目录(你可以创建任意目录,这里使用package只是为了保持与英文作者的一致):  
      mkdir -p /package
      chmod 1755 /package
      cd /package

      下载daemontools-0.76.tar.gz到/package目录,解压该包。

           http://cr.yp.to/daemontools/daemontools-0.76.tar.gz  


      tar xvzf daemontools-0.76.tar.gz
      cd admin/daemontools-0.76

      编译并安装daemontools程序
      
      package/install

     【注意】:如果在安装过程中出现安装失败的提示,是因为daemontools 需要一个补丁daemontools-0.76.errno.patch,这个补丁在qmail包中有。或者修改daemontools 源代码来修补这个bug

    (修改方法:在src下的conf-cc文件的第一行最后添加如下代码即可  -include /usr/include/errno.h

         # vi src/conf-cc

         在最后加上 -include /usr/include/errno.h

    如果安装成功,你可以用下面命令确认:

    # ps -ef | grep svscan
    # man svscan

    此时你查看一下inittab文件:
        # cat /etc/inittab

          会发现原来daemontools是使用init的方式来保护自己的:

        SV:123456:respawn:/command/svscanboot

         通过strace命令你能看到系统每隔五秒会核对一下服务:
        # strace -p `pidof svscan`


    四、使用supervise程序进行程序管理监控

      supervise的执行命令是supervise Path ,其中Path 是指定路径,可以是相对路径,也可以是绝对路径。在Path路径下,必须有一个run的脚本,supervise调用的就是这个脚本,并监控管理该脚本中运行的程序。

      supervise的一个重要的功能就是可以检测出run脚本中执行的程序是否正常工作,若发现其已经死掉,supervise将会重新执行run脚本,重新启动指定程序。这对于很多服务端程序来说是十分必要的,没有人愿意在深夜2点的时候从被窝里爬出来重新启动服务器。

      下面是一个简单使用supervise的例子。

    五、1)例子1

      假定已经安装好daemontools,建立一个test目录,进入该目录
      
      mkdir /temp1
      cd /temp1

      在该目录下写一个简单测试程序test.c:  

      编译test.c输出为test。  
      gcc -o test test1.c

      编写一个脚本run,来执行test程序,以便supervise进行调用。 

      

          #!/bin/sh  

          echo "start test!"  

          ./test

      退到上级目录,执行 supervise temp1看看效果:
      
      cd ..
      supervise temp1

      执行killall -9 test,杀死test进程,你会发现supervise会重新启动test进程。当然如果程序core dump,supervise同样会重新启动程序。

    C代码  收藏代码
    1. #include   
    2. #include     
    3.   
    4. int main(){  
    5.      int ix = 0;   
    6.    for(;; ix++){    
    7.         printf("%d ", ix);  
    8.             sleep(1);   
    9.    }   
    10.    return 0;   
    11. }   

      

    注意:当停止再次启动supervise监控某目录时,会提示:

    supervise: fatal: unable to acquire /service/test/supervise/lock: temporary failure

    这时删除目录下的supervise重新监控即可。

       2)例子2 (java)

       命令: mkdir /service/test

                  cd /service/test

                   ll

                   vi demo.java

                  

    Java代码  收藏代码
    1. class demo{  
    2.         public static void main(String[] args) throws Exception{  
    3.                 for(int i=0;;i++){  
    4.                         System.out.println("i="+i);  
    5.                         Thread.sleep(1000);  
    6.                 }  
    7.         }  
    8. }  

                  javac -d . demo.java

                  vi run

       

    Xml代码  收藏代码
    1. #!/bin/sh  
    2.   
    3. echo -e "start test";  
    4. exec java demo  

                chmod +x run

        执行监控目录 :supervise /service/test

         [终端打印出来标号]

         再开启一个终端,查看正在执行这个命令的进程id,执行 ps -A

         找到 java这个进程的id号,

         执行 killall -9 java

         看前一个终端,是不是打印又从新开始了,呵呵。这说明中断之后supervise又启动这个进程了

       3)例子3

         mkdir  /tmp/test

          cd /tmp/test

          vi demo.java

          [代码同例子2]

          javac -d . demo.java

         vi run

        

    Java代码  收藏代码
    1. #!/bin/sh  
    2.   
    3. echo -e "start test2";  
    4. exec java -classpath /tmp/test demo  

         chmod +x run

         ln -s /tmp/test  /service/test

         ll /service

         supervise /service/test

    发现开始打印了,这时在另一个终端执行 killall -9 java ,则发现这个终端的打印又从新开始了,也就是杀掉进程之后立即又从新执行run了     

      4)实例4 监控tomcat启动

          假如tomcat 在redhat的 /var/tomcat6

        在/service目录下新建一个run文件,内容如下:

    Java代码  收藏代码
    1. #!/bin/sh  
    2.   
    3. TOMCAT_HOME=/var/tomcat6  
    4. exec ${TOMCAT_HOME}/bin/catalina.sh run  

        执行supervise /service

        则发现tomcat启动了。

    测试: 新打开一个终端,ps -ef |grep tomcat

    找到tomcat的id,执行 kill -9 [tid]

    杀掉了tomcat但在之前的终端窗口上却显示重新启动了tomcat。

  • 相关阅读:
    java初学
    数据库命名及设计规范(转)
    转-ASP.NET页面之间传递值
    程序员个人职业规划
    如何学习别人的代码(转)
    可映射的CSV读取引擎
    iTween扩展
    Unity3d中NGUI加强版血条(Healthbar)的制作
    Unity3D中寻路Navmesh的简单介绍
    多人网络(Valve开发文档翻译[起源引擎])(一)
  • 原文地址:https://www.cnblogs.com/lushilin/p/9803348.html
Copyright © 2011-2022 走看看