Total Pageviews

Sunday, 4 March 2018

Daemontools--supervise, 系统进程监控器

一、工具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. 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
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. 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
Java代码  复制代码  收藏代码
  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文件,内容如下:
Java代码  复制代码  收藏代码
  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。
【注】:好像用tomcat的./shutdown.sh命令不能使监控重启,出现异常,端口占用,可能是还没等tomcat关闭监控就执行了启动命令。
参考资料:1)官网: http://cr.yp.to/daemontools.html

from http://blog.csdn.net/zeo112140
--------

The supervise program

supervise starts and monitors a service.

Interface

     supervise s
supervise switches to the directory named s and starts ./run. It restarts ./run if ./run exits. It pauses for a second after starting ./run, so that it does not loop too quickly if ./run exits immediately.
If the file s/down exists, supervise does not start ./run immediately. You can use svc to start ./run and to give other commands to supervise.
supervise maintains status information in a binary format inside the directory s/supervise, which must be writable to supervise. The status information can be read by svstat.
supervise may exit immediately after startup if it cannot find the files it needs in s or if another copy of supervise is already running in s. Once supervise is successfully running, it will not exit unless it is killed or specifically asked to exit. You can use svok to check whether supervise is successfully running. You can use svscan to reliably start a collection of supervise processes.

from http://cr.yp.to/daemontools/supervise.html
------------

相关帖子:http://briteming.blogspot.com/2015/11/linux.html (我觉得此文里说的monit更好用些)

No comments:

Post a Comment