文档章节

Supervisor

lionets
 lionets
发布于 2016/12/12 21:25
字数 492
阅读 33
收藏 0

配置文件


创建的默认配置文件本身包含好几个项目,他们的功能分别是:

unix_http_server 提供一个 Unix socket 的接口,这是 supervisorctl 默认使用的接口,用于和 supervisord 通信。

如果想让一个虚拟环境只负责一组进程,而不是创建一个全局的 supervisord 的话,这里面的 file 项就应该改成一个特有的文件名,而不是默认的 /tmp/supervisord.sock

inet_http_server 提供网络 socket 接口,可以支持 xmlrpc 通信。可以替代 Unix socket,也可以一起开。当然用不上的话也可以不开。

supervisord 主进程,有需要的话配一下他的日志 和 pid 文件路径。

supervisorctl,控制进程,serverurl 要和上面的保持一致。即你开的是哪一种 server,然后配的分别是什么地址。

最后就是你的真正进程的配置了。注意 directory 项记得配,不然容易出现路径问题。

进程监控

如果要通过脚本定时监控进程状态,可以有两种方法。背后其实就是你开的两种不同 server。

一是通过 supervisorctl 访问 Unix socket,二是通过 xmlrpc 访问 inet。

第一种,直接从 supervisor 包引入组件,缺点是有虚拟环境依赖。


from supervisor.supervisorctl import Controller
from supervisor.options import ClientOptions
from cStringIO import StringIO

ST_OK = ''

def check_process_status(process_name):
    std_cap = StringIO()
    args = ['-c', '/etc/supervisord.conf', 'status']
    options = ClientOptions()
    options.realize(args, doc=__doc__)
    controller = Controller(options)
    controller.stdout = std_cap
    try:
        controller.onecmd(" ".join(options.args))
    except Exception as e:
        return str(e)
    else:
        std_cap.seek(0, 0)
        for line in std_cap:
            output = filter(bool, line.split(' '))
            if output and output[0] == process_name:
                if output[1] in ['STOPPED', 'BACKOFF', 'EXITED', 'FATAL', 'UNKNOWN']:
                    return ' '.join(output)
                else:
                    return ST_OK
    return 'process: %s not found in supervisorctl.' % process_name

另一种是通过内建的 xmlrpc 包访问 supervisord 的 inet 接口。这需要在启动 supervisord 的时候打开 inet 选项。

import xmlrpclib

ST_OK = ''
SUPERVISOR_RPC = 'http://localhost:9002/RPC2'

def check_process_state(process='linking_api'):
    server = xmlrpclib.Server(SUPERVISOR_RPC)
    try:
        process_info = server.supervisor.getProcessInfo(process)
        assert isinstance(process_info, dict), 'Invalid supervisor rpc return.'
    except Exception as e:
        return str(e)
    else:
        state = process_info.get('statename')
        if state in ['STARTING', 'RUNNING', 'STOPPING']:
            return ST_OK
        else:
            return '%s: %s' % (process_info.get('name'), state)

© 著作权归作者所有

共有 人打赏支持
lionets
粉丝 90
博文 101
码字总数 135303
作品 0
朝阳
程序员
私信 提问
(整理)用Elixir做一个多人扑克游戏 3

今天我们将为德州扑克游戏添加故障恢复能力。 OTP为我们准备好了构建容错程序所需要的工具。我们只需要定义正确的behavior 行为。 Supervisor 有了Supervisor,我们就只需要关心当进程崩溃时...

ljzn
2016/10/05
38
0
python 部署:virtuale + gunicorn + supervisor + flask

主要参考 Flask + Gunicorn + Nginx 部署 http://www.cnblogs.com/Ray-liang/p/4837850.html python web 部署:nginx + gunicorn + supervisor + flask 部署笔记 http://www.jianshu.com/p/b......

曹梦龙
2016/07/19
433
2
CentOS7下Supervisor安装与配置(Linux/Unix进程管理工具)

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多...

yzy121403725
06/27
0
0
进程管理利器Supervisor--入门简介

目录 概述 Supervisor是什么 Supervisor意图 Supervisor特性 Supervisor组件 平台需求 概述 项目运行需要后台运行,一般都是使用 nohup,但是nohup不能对后台进程监控和失败重启等高级功能,有木...

java_龙
11/30
0
0
supervisor运行golang守护进程

Supervisor是一个C/S系统,它可以在类UNIX系统上控制系统进程,由python编写,它提供了大量的功能来实现对进程的管理。 程序的多进程启动,可以配置同时启动的进程数,而不需要一个个启动 程序...

Minho
2016/07/09
115
1

没有更多内容

加载失败,请刷新页面

加载更多

【58沈剑 架构师之路】选redis还是memcache,源码怎么说

memcache和redis是互联网分层架构中,最常用的KV缓存。不少同学在选型的时候会纠结,到底是选择memcache还是redis。 画外音:不鼓励粗暴的实践,例如“memcache提供的功能是redis提供的功能的...

张锦飞
14分钟前
1
0
不要依赖于线程调度器(72)

多个线程可运行时, 线程调度器决定哪些线程将会被运行、以及运行多长时间 任何操作系统在处理该问题时,会 尽力做到公正,但是策略却大相径庭 编写良好的程序不要依赖这种策略细节,否则程序...

Java搬砖工程师
18分钟前
0
0
路由器AP、路由、中继、桥接模式之间的区别

在TP-Link迷你无线路由器上一般有AP(接入点)模式、Router(无线路由)模式、Repeater(中继)模式、Bridge(桥接)模式、 Client(客户端)模式;已经属于模式很全的路由了,尽管仅仅只是一个小...

吴伟祥
18分钟前
0
0
初识kafka的zookeeper

最近项目中,使用redis进行消息的分发与订阅。这种模式就是一种多播的方式,但是随着消息的不断增加,消费端来不及处理所有的数据。在没有持久化的功能下,很多数据丢失了。当然,也可以使用...

孟飞阳
20分钟前
1
0
赋能时空云计算,阿里云数据库时空引擎Ganos上线

随着移动互联网、位置感知技术、对地观测技术的快速发展,时空信息已从传统GIS行业渗透到大众应用及各行各业。从静态POI(兴趣点)到APP位置信息,从导航电子地图到车辆行驶轨迹,从卫星影像...

阿里云官方博客
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部