1.背景
无论多么优秀的程序员都难以避免写出来的程序会有崩溃的一天,特别是c、c++这种高技术含量的语言,一不小心就来个段错误(segment fault),我们通常会写一个守护进程或者守护脚本,检测对应的进程是否退出,如果发现目标进程退出了,就马上在fork或者启动一个新的,这样的检测逻辑不复杂,简单几行代码即可,但是如果你要检查的程序有很多个,用不同的语言编写等等,就比较繁琐了。
2.supervisor安装
今天给大家介绍的这个工具叫supervisor,看名字就知道是一个专门给管理员用的,这个工具非常强大,今天我们只做一个简单而实用的介绍,就是实现用supervisor监管你的程序服务,当程序服务异常退出了,它帮你自动再开启一个新的。
#supervisor的安装很简单,我们这里以Ubuntu16为例
#apt一下即可,别忘了安装之前要update一下
apt install -y supervisor
#一切顺利之后,你会看到supervisor的服务和对应配置文件信息
service supervisor status
ls /etc/supervisor/
3.supervisor实战
我们以一个python服务为例子,先看看这个例子的代码如下
#!/usr/bin/env python
# test.py
# 如果还没装webpy的,先去webpy官网看安装教程,比较简单
# http://webpy.org/
import web
urls = (
'/', 'index'
)
class index:
def GET(self):
return "Hello, world!"
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
这是一个用python webpy框架做的一个简单的http服务程序,监听了8080端口提供http服务,使用命令 python test.py 运行即可。
下面我们开始配置supervisor,监控上面我们做的这个简单的程序服务 test.py。在supervisor的配置目录 /etc/supervisor/conf.d 下面创建一个 test_python.conf 的文件。/etc/supervisor/conf.d 这个目录是supervisor用来给配置不同监管用的配置文件夹,supervisor服务会包含这个目录下面所有的conf配置文件,并识别里面的内容对其进程服务进行监管。下面我们看看我们这个 test_python.conf配置内容如下
#监控服务名称,这个自己起一个名字即可
[program:test_python]
#指定进程的目录,这里我们是在/tmp创建的,为了演示
directory = /tmp
#程序启动参数,这个比较简单,用python运行
command = python test.py
#是否跟随supervisord的启动而启动,我们设置了true是
autostart=true
#程序退出后自动重启,选择true是
autorestart=true
#进程被杀死时,是否向这个进程组发送stop信号,包括子进程,选择true是
stopasgroup=true
#向进程组发送kill信号,包括子进程,选择true是
killasgroup=true
#下面这几行是日志文件和日志大小和备份个数
stdout_logfile=/var/log/test_python.log
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 10
配置内容比较简单明了,配置完之后,我们重启一下supervisor服务,service supervisor restart,一切顺利之后再用 service supervisor status看看服务运行状态。当supervisor服务重启后,它会发现 test.py 进程没有起来,然后就开启了 test.py 进程。
ps -ef|grep-v grep|grep test.py
root 27314 27284 0 10:10 ? 00:00:00 python test.py
#把进程kill掉,模拟进程崩溃退出
kill -9 27314
#再看看程序有没有被重新开起来
ps -ef|grep -v grep|grep test.py
root 27483 27284 4 10:45 ? 00:00:00 python test.py
#可以看到进程号已经变了是 27483,证明程序是新启动不是旧的
睿江云官网链接:睿江云主机租用-云服务器-支持免费测试-国内专业的云主机提供商