云服务器

用supervisor监管你的程序,不用担心程序挂了

2019-12-05 14:31:01 50
背景

    无论多么优秀的程序员都难以避免写出来的程序会有崩溃的一天,特别是c、c++这种高技术含量的语言,一不小心就来个段错误(segment fault),我们通常会写一个守护进程或者守护脚本,检测对应的进程是否退出,如果发现目标进程退出了,就马上在fork或者启动一个新的,这样的检测逻辑不复杂,简单几行代码即可,但是如果你要检查的程序有很多个,用不同的语言编写等等,就比较繁琐了。

supervisor安装

    今天给大家介绍的这个工具叫supervisor,看名字就知道是一个专门给管理员用的,这个工具非常强大,今天我们只做一个简单而实用的介绍,就是实现用supervisor监管你的程序服务,当程序服务异常退出了,它帮你自动再开启一个新的。


  1. #supervisor的安装很简单,我们这里以Ubuntu16为例

  2. #apt一下即可,别忘了安装之前要update一下

  3. apt install -y supervisor


  4. #一切顺利之后,你会看到supervisor的服务和对应配置文件信息

  5. service supervisor status

  6. ls /etc/supervisor/


supervisor实战

    我们以一个python服务为例子,先看看这个例子的代码如下


#!/usr/bin/env python# test.py# 如果还没装webpy的,先去webpy官网看安装教程,比较简单# http://webpy.org/import weburls = (    '/', '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.logstdout_logfile_maxbytes = 50MBstdout_logfile_backups  = 10

    配置内容比较简单明了,配置完之后,我们重启一下supervisor服务,service supervisor restart,一切顺利之后再用 service supervisor status看看服务运行状态。当supervisor服务重启后,它会发现 test.py 进程没有起来,然后就开启了 test.py 进程。


  1. ps -ef|grep-v grep|grep test.py

  2. root     27314 27284  0 10:10 ?        00:00:00 python test.py


  3. #把进程kill掉,模拟进程崩溃退出

  4. kill -9 27314

  5. #再看看程序有没有被重新开起来


  6. ps -ef|grep -v grep|grep test.py

  7. root     27483 27284  4 10:45 ?        00:00:00 python test.py


  8. #可以看到进程号已经变了是 27483,证明程序是新启动不是旧的




睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

上一篇: 无

微信关注

获取更多技术咨询