当前位置: 首页 > news >正文

daemontools 监控进程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、学习的原因:

      为了实现在tomcat服务异常停止运行后,有一个监控程序能监控到它,并自动重新启动这个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\n", 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。

【注】:好像用tomcat的./shutdown.sh命令不能使监控重启,出现异常,端口占用,可能是还没等tomcat关闭监控就执行了启动命令。

 

转载于:https://my.oschina.net/swearyd7/blog/270777

相关文章:

  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • select的使用(一)
  • LeeCode 14. 最长公共前缀
  • struts2 中的 addActionError 、addFieldError、addAction
  • 广西苗乡民众与游人“打同年”庆祝苗年
  • 网站验证码突然无法显示
  • [leetcode]Search a 2D Matrix @ Python
  • 雷军亲自打造的套餐了解下:用多少付多少
  • linux的进程管理
  • 网站三要素tdk如何正确的设置
  • 快照——COFW\ROFW
  • java B2B2C Springcloud电子商城系统-springCloud跨域访问
  • VSAN 和 vSphere Replication 的互操作
  • 阿里云基础产品技术月刊 2018年12月
  • java.io.BufferedOutputStream 源码分析
  • 345-反转字符串中的元音字母
  • Debian下无root权限使用Python访问Oracle
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • SegmentFault 2015 Top Rank
  • Service Worker
  • webpack+react项目初体验——记录我的webpack环境配置
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 近期前端发展计划
  • 前端
  • 网络应用优化——时延与带宽
  • 微信公众号开发小记——5.python微信红包
  • 一份游戏开发学习路线
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (39)STM32——FLASH闪存
  • (待修改)PyG安装步骤
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (转)Google的Objective-C编码规范
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net MVC4 上传大文件,并保存表单
  • .Net Winform开发笔记(一)
  • .net6+aspose.words导出word并转pdf
  • .NET开发者必备的11款免费工具
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C/C++] -- 二叉树
  • [CTF]2022美团CTF WEB WP
  • [C语言]——C语言常见概念(1)
  • [DAX] MAX函数 | MAXX函数
  • [Gamma]阶段测试报告
  • [IE编程] IE 是如何决定Accept-Language 属性的