1 引言

Supervise是一个进程管理工具,使用场景:将服务用supervise启动,当业务进程挂掉后,迅速拉取业务进程。

实际上supervise是开源工具集daemontools( http://cr.yp.to/daemontools.html )其中的一个工具,公司内很多服务都用了这个工具,为了方便结合公司的报警接口。

2 编译安装

编译安装比较简单,工具开源地址

https://github.com/daemontools/daemontools

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

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

vim src/conf-cc
gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings -include /usr/include/errno.h

package/install

编译完成后有一系列的工具,其中supervise就是最常用的一个

supervise

3 举例

新建test目录,并在test目录新建edate.sh、run文件,文件内容如下:

# edate.sh
#! /bin/bash
echo `date +"%Y-%m-%d %H:%M:%S"`
sleep 5


#run
#! /bin/sh
echo "start test /home/work/software/admin/test/edate.sh"
sh /home/work/software/admin/test/edate.sh

目录结构如下:

supervise_demo

用supervise启动:nohup /home/work/software/admin/daemontools-0.76/command/supervise ./test 2>&1 >> test.log &

查看日志文件:tail -f test.log

supervise_demo_log

4 工作原理

模块的工作原理实际上很简单,supervise启动的时候fork一个子进程,子进程执行execvp系统调用,将自己替换成执行的模块,模块变成supervise的子进程在运行,而supervise则死循环运行,并通过waitpid或者wait3系统调用选择非阻塞的方式去侦听子进程的运行情况,当然同时也会读取pipe文件svcontrol的命令,然后根据命令去执行不同的动作,如果子进程因某种原因导致退出,则supervise通过waitpid或者wait3获知,并继续启动模块,如果模块异常导致无法启动,则会使supervise陷入死循环,不断的启动模块。

查看supervise.c源码:

https://github.com/daemontools/daemontools/blob/master/src/supervise.c

supervise_source

5 Python版本(supervisor)

该工具很受欢迎,但由于是C写的,使用和改造都比较麻烦,各种语言都有相应的版本,Python版本最突出。

安装简单、使用方便,在github.com很受欢迎。

https://github.com/Supervisor/supervisor

supervisor有以下两个部分组成:

supervisord: supervisor的服务器端部分,启动supervisor就是运行这个命令 supervisorctl: 启动supervisor的命令行窗口

详细介绍参见官网

http://supervisord.org/

# 1.安装
pip install supervisor


# 2.配置
vim /etc/supervisor/conf.d/demo.conf


[program:demo]        #项目名称为demo
command=python main.py          #运行脚本
stderr_logfile=/var/log/supervisor/error_demo.log        #错误日志
stdout_logfile=/var/log/supervisor/demo.log        #输出
directory=/root/demo/        #项目路径
autostart=true        #当supervisor 启动时会自动启动
user=root        #用户
autorestart=true        #自动重启



# 3.常用操作
supervisorctl status        //查看所有进程的状态
supervisorctl stop es       //停止es
supervisorctl start es      //启动es
supervisorctl restart       //重启es
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序

参考

http://supervisord.org/

https://www.jianshu.com/p/0b9054b33db3