一、学习的原因:

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

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

注意:当停止再次启动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

  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

  1. #!/bin/sh
  2. echo -e "start test";
  3. 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

  1. #!/bin/sh
  2. echo -e "start test2";
  3. 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文件,内容如下:

  1. #!/bin/sh
  2. TOMCAT_HOME=/var/tomcat6
  3. exec ${TOMCAT_HOME}/bin/catalina.sh run

执行supervise /service

则发现tomcat启动了。

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

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

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

daemontools检测进程,退出拉起的更多相关文章

  1. Inno Setup 安装、卸载前检测进程或服务

    [转载]Inno Setup 安装.卸载前检测进程或服务 (2015-04-24 17:37:20) 转载▼ 标签: 转载   原文地址:Inno Setup 安装.卸载前检测进程或服务作者:一去丶二 ...

  2. Ambari Auto Start(进程自动拉起)

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/7886850.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  3. Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程

    需求 最近用 Inno Setup 做一个exe,可是在安装之前要停止正在运行的相应进程或者在卸载之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,最后经过度娘的耐心帮助下终于在网上找到 ...

  4. 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析

    fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...

  5. ssh连接断开后 shell进程退出

    问题描述:当SSH远程连接到服务器上,然后运行一个服务 ./catalina.sh start,然后把终端开闭(切断SSH连接)之后,发现该服务中断,导致网页无法访问.   解决方法:使用nohup命 ...

  6. TODO:Golang Linux进程退出说明

    TODO:Golang Linux进程退出说明 Golang使用os.Exit(code)进程退出导致当前程序退出并返回给定的状态代码.传统上,code代码为零表示成功退出,非零错误退出. sysca ...

  7. Linux 进程退出后自动启动

    /********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系 ...

  8. 进程退出前删除自身EXE

    进程退出前删除自身EXE 下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手. ...

  9. linux创建进程和等待进程退出

    在WIN32下,在一个进程里我们可以使用CreateProcess()创建一个进程,然后通过调用WaitForSingleObect(), WaitForMultipleObject()等待进程退出. ...

随机推荐

  1. mybatis的入门(二)

    上篇文章首先介绍了JDBC操作数据库的相关知识,并总结了JDBC操作数据存在的一些问题,那么这篇文章我们来介绍下mybatis的相关内容 一.mybatis的架构图 下面对上面的架构图详细说明下: 1 ...

  2. 高阶篇:4.1.2.1)产品总成级别的QFDII

    本章目的:介绍产品总成级别的QFDII编写方法. 1.前言 这章接QFDI和QFDII总章节. 产品总成级别的QFDII,其实就是将QFDI所得到的设计要求,接着分配给产品的第一装配层级的零部件中. ...

  3. SPOJ - COT 路径构造主席树

    题意:给出一个带权树,多次询问路径\((u,v)\)的第k小权值 这是主席树往区间扩展到树上的套路题 由于是按路径查询,我们无法使用dfs序,但可利用主席树对父亲扩展的方法构造出链 因此要用dfs构造 ...

  4. squid的简单介绍

    squid的简单介绍 squid的概念 squid是一种用来缓存Internet数据的软件.接受来自人们需要下载的目标(object)的请求并适当的处理这些请求.也就是说,如果一个人想下载一web界面 ...

  5. 认识CSS中css引入方式、选择器、文本样式设置以及显示模式

    前端之HTML.CSS(三) CSS CSS-Cascading Styles Sheets,层叠样式表.用于网页的表现,主要用于布局和修饰网页. CSS引入方式 CSS的三种引入方式:行内样式,内部 ...

  6. PIE SDK 文章目录索引

    1.PIE SDK介绍 1.1.  PIE软件介绍 1.2.  PIE SDK介绍 1.3.  PIE支持项目介绍 1.4.  PIE.NET-SDK插件式二次开发介绍 1.5.  PIE.NET-S ...

  7. CSAPP阅读笔记-数组分配与访问-来自第三章3.8的笔记-P176-P183

    这一节比较简单,仅记录几个比较重要的点: 1.C语言允许对指针进行运算,计算出的值会根据该指针引用的数据类型大小进行伸缩. 例子: 其中,xE是数组的起始地址.注意,指针运算时,若最终结果为指针,则指 ...

  8. 修改eclipse下tomcat的内存大小/解决内存溢出

    我们安装完成eclipse之后,在我们的安装目录下有一个名为eclipse.ini文件. 打开文件里面的内容如下: -startup plugins/org.eclipse.equinox.launc ...

  9. 使用spring遇到问题 事物不提交和更新失败

    1 使用学习使用spring mvc进行前端代码编写,发现提交修改没发sql语句 测试dao层又没问题 解决: 原来是spring配置文件,事物管理 绑定到了dao层.测试界面前端应该绑定到servi ...

  10. 入门系列之在Nginx配置Gzip

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小铁匠米兰的v 发表于云+社区专栏 简介 网站加载的速度取决于浏览器必须下载的所有文件的大小.减少要传输的文件的大小可以使网站不仅加载 ...