supervisor 子进程退出_用supervisor监管你的程序,不用担心程序挂了

6250921adc56ab427273dcd79f67d747.png

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,证明程序是新启动不是旧的

36f90565a059f8a8cff7dac5496067b1.png

睿江云官网链接:睿江云主机租用-云服务器-支持免费测试-国内专业的云主机提供商

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值