首页 > linux/unix > 进程的守护神 – daemontools(进程监控)
2017
08-11

进程的守护神 – daemontools(进程监控)

1. daemontools介绍

daemontools是一个守护进程工具,用来监视一个进程以免其意外退出,例如用来监视某个目录中的一个java程序入口,让它一直处于运行状态。被daemontools守护的进程是无法使用kill指令杀死的,但这样说不准确,实际上是可以杀死的,只是杀死后立即重启。daemontools的设计理念就是这样的。它包括很多程序(或者说是命令)。

如下:

svscanboot: 这条指令非常重要,但是一般不需要自己手动输入执行,它用来启动 /service 目录下的svscan(请看svscan)命令,然后svscan会启动supvise(请看supvise),supvise会执行run脚本并且监视它。安装成功后在Linux重启的时候会自动执行svscanboot。

svscan: 用来启动服务目录下的所有子目录中的supervise(请看supervise)进程,svscan启动两个一对supervise进程,一个子目录s,一个子目录s下的log目录(如果有的话),启动的时候程序会自动运行子目录s中的run脚本,并且监视run脚本启动的进程,同时会启动s/log中的run脚本,这个脚本可以用来输出s目录中的run脚本的日志到指定目录下。s/log中的run脚本请看后边的例子。svscan每五秒检查一次子目录,如果发现新的目录,它会为这个目录启动一个新的supervise进程。如果发现一个已经执行过supervise但是supervise已经退出的目录,它会为这个目录重启supervise进程。svscan被设计成一直运行的,如果无法执行supervise,它会每隔5秒重试一次。

 

supervise: 这个命令会执行一个目录例如s下的run脚本,如果run脚本存在的话。执行完后run脚本后如果run脚本退出的话它会隔几秒再执行一次。如果s/down文件存在的话,supervise则不会立刻启动run脚本, 可以用svc(请看svc)命令来启动,supervise在s/supervise目录下维护一个二进制格式状态信息,所以这个目录对supervise必须是可写的,svstat(请看svstat)命令可以用来读取这个状态信息。当supervise在s目录中找不到他需要的文件或者已经有了一个supervise在s目录中运行时,supervise退出后不会立刻启动。一旦supervise成功运行起来了它是不会退出的除非被杀死或者被明确的要求退出。

svc命令 
svc opts services 
opts是一系列的参数,services是指/service下的服务目录。opts参数如下: 
-u : up, 如果services没有运行的话,启动它,如果services停止了,重启它。 
-d : down, 如果services正在运行的话,给它发送一个TERM(terminate)信号,然后再发送一个CONT(continue)信号,在它停止后,不再启动它。 
-o : once, 如果services没有运行,启动它,但是在它停止后不再启动了。就是只运行一次。 
-p : pause, 给services发送一个停止信号。 
-c : continue, 给services发送一个CONT信号。 
-h : hang up, 给services发送一个HUP信号。 
-a : alarm, 给services发送一个ALRM信号。 
-i : interrupt, 给services发送一个INT信号。 
-t : Terminate, 给services发送一个TERM信号。 
-k : kill, 给services发送一个KILL信号。 
-x : exit, supervise在services停止后会立刻退出, 但是值得注意的是,如果你在一个稳定的系统中使用了这个选项,你已经开始犯错了:supervise被设计成为永远运行的。 
关掉一个服务进程通常使用-dk参数,此时supervise进程并没有关闭,所以依然可以将这个服务进程重启。即使,supervice进程挂掉了,svscan依然会重启supervise,supervise会重新运行服务进程的run脚本

svok: 用来检查supervise是否在运行。

svstat 
查看服务的状态

 

2. 在centOS6.4上安装daemontools步骤

  • mkdir -p /package  //创建一个文件夹
  • chmod 1755 /package  //给文件夹改权限
  • cd /package  //进入这个文件夹
  • wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz     //使用wget命令下载daemontools到当前目录下
  • gunzip daemontools-0.76.tar 
  • tar -xpf daemontools-0.76.tar //这两步解压daemontools
  • rm -f daemontools-0.76.tar //  删除安装包
  • cd admin/daemontools-0.76/        //进入到安装文件夹中
  • vi src/conf-cc  在打开的编辑窗口中的gcc开头的哪一行的最后面空一格添加  -include /usr/include/errno.h
  • package/install     //安装

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

# ps -ef | grep svscan
# man svscan

 

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

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

SV:123456:respawn:/command/svscanboot

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

 

3. 启动daemontools

svscanboot工具用来启动svscan工具。可以通过以下命令启动svscanboot

# /command/svscanboot &

也可以设置开机启动,具体参考

启动之后,查看进程,可以发现svscan做为svscanboot的子进程在运行

# ps -ef|grep svs  
root     125774   7340  0 14:22 pts/6    00:00:00 /bin/sh /command/svscanboot
root     125777 125774  0 14:22 pts/6    00:00:00 svscan /service

4. 配置

启动svscanboot之后,相应的svscan进程也启动起来,其中参数/service/ 就是管理配置文件的目录

1.创建services目录,例如

# mkdir -p /service/daemontest

2.在services目录创建run脚本(名字必须是run而且权限是755)

#touch /service/daemontest/run  && chmod 755 /service/daemontest/run

#cat /service/daemontest/run

#!/bin/sh

exec /root/bin/test   1>/dev/null 2>&1

创建symbol link, 创建完后daemontools会自动启动nginx进程

root     125774   7340  0 14:22 pts/6    00:00:00 /bin/sh /command/svscanboot

# pstree -a  -p 125774
svscanboot,125774 /command/svscanboot
  ├─readproctitle,125778 service errors:...
  └─svscan,125777 /service
      └─supervise,125779 daemontest
          └─test,126078

从中可以看出来,svscanboot负责启动svscan服务,svscan管理supervise进程。而具体的客户进程,是通过supervise进程来统一管理的

现在test被daemontool管理起来了,试试看杀掉test应用进程看看

# kill  -9  126078
# pstree -a -p 125774
svscanboot,125774 /command/svscanboot
  ├─readproctitle,125778 service errors:...
  └─svscan,125777 /service
      └─supervise,125779 daemontest
          └─test,129717

可以看到,虽然手动kill掉了test应用,但是daemontool自动将应用重新启动起来了

5.常用命令

1.启动被管理的进程 (配置完后无需执行svc命令)

svc -u /service/daemontest/  (启动之后,如果daemontest挂掉,daemontools会自动重启daemontest)

2.关闭被管理的进程(不会关闭daemontools supervise进程)

svc -d /service/daemontest/

3.查看service状态

svstat /service/daemontest/

4.移除service

svc -dx /service/daemontest/

 

daemontools官网:http://cr.yp.to/daemontools.html

 

 

最后编辑:
作者:liujg
真实-不弄虚,不做假,做自己,不违心; 踏实-不浮躁,不盲从,不急功,不近利; 实学-不投机,不取巧,勤于学,精于业。