Supervisor

配置文件


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

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)

转载于:https://my.oschina.net/lionets/blog/804729

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值