supervisor-3:xml_rpc

别人博客转载,作个记录java

原文连接:http://lixcto.blog.51cto.com/4834175/1540795python

    supervisor提供的两种管理方式,supervisorctl和web其实都是经过xml_rpc来实现的。web

xml_rpc其实就是本地能够去调用远端的函数方法,而后函数方法通过一番处理后,把结果返回给咱们。bash

xml_rpc不懂的同窗建议去百度百度它的原理机制。这个比较简单,楼主也是上午刚搞懂。运维

    在python里面实现xml_rpc就更加的简单,用SimpleXMLRPCServer和xmlrpclib这两个模块就能够分别实现服务端和客户端了。python2.7

调用supervisor的xml_rpc接口,其实很简单。先作好下面这两步函数

import xmlrpclib
p = xmlrpclib.Server('http://localhost:9001/RPC2')
 

注意xmlrpclib.Server()里面的url和我们supervisor.conf里的配置是相关的url

作完上面的步骤,咱们就能够获得一个叫作p的对象。p这个对象,有不少存放在服务端的方法。3d

supervisor默认的xml_rpc方法定义在下面这个路径里面rest

/usr/local/lib/python2.7/dist-packages/supervisor-3.1.0-py2.7.egg/supervisor/rpcinterface.py

咱们可使用system.listMethods()的方法,来查看服务端都有哪些方法可供调用?

>>>server.system.listMethods()
['supervisor.addProcessGroup', 'supervisor.clearAllProcessLogs', 'supervisor.clearLog', 'supervisor.clearProcessLog', 'supervisor.clearProcessLogs', 'supervisor.getAPIVersion', 'supervisor.getAllConfigInfo', 'supervisor.getAllProcessInfo', 'supervisor.getIdentification', 'supervisor.getPID', 'supervisor.getProcessInfo', 'supervisor.getState', 'supervisor.getSupervisorVersion', 'supervisor.getVersion', 'supervisor.readLog', 'supervisor.readMainLog', 'supervisor.readProcessLog', 'supervisor.readProcessStderrLog', 'supervisor.readProcessStdoutLog', 'supervisor.reloadConfig', 'supervisor.removeProcessGroup', 'supervisor.restart', 'supervisor.sendProcessStdin', 'supervisor.sendRemoteCommEvent', 'supervisor.shutdown', 'supervisor.startAllProcesses', 'supervisor.startProcess', 'supervisor.startProcessGroup', 'supervisor.stopAllProcesses', 'supervisor.stopProcess', 'supervisor.stopProcessGroup', 'supervisor.tailProcessLog', 'supervisor.tailProcessStderrLog', 'supervisor.tailProcessStdoutLog', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall']

   看到了吧,有这么多的方法,咱们若是想知道某一个方法怎么用,能够用system.methodHelp(name)去查看,例如:

server.system.methodHelp('supervisor.startProcess')

  

 这么查看其实仍是有点麻烦的,直接去官网看吧,官网上列举了经常使用方法的用法。其实supervisor自己提供的xml_rpc的方法有不少不少,包括查看进程状态,启动/中止/重启进程,查看日志,发送event等等。

    有了这些方法,咱们就能够向远处执行相应的操做。或者获取想要的数据,OK,后续数据怎么处理,怎么用,就能够根据大伙的实际需求去发挥了。

    还有上面的每一个方法都是supervisor.x的形式,前面的supervisor实际上是,咱们定义在

[rpcinterface:supervisor],rpc接口的名称。

    既然有,rpc接口须要名称,那么显然名称是为了区分rpc接口。在supervisor里面,若是咱们以为supervisor自带的rpc接口函数不够用,那么咱们就能够定义本身的rpc接口函数。本身定义的函数能够直接写进rpcinterface.py里面去。不过为了避免污染人家原有的东西,最好别这么干。

    supervisord中rpc接口函数定义的方法,除了须要在supervisord.conf中加上一块配置外,还须要一个函数签名。

    先看看supervisord.conf中怎么定义吧。配置文件中找个地方,放入下面这么段东西。里面具体的接口名称,路径,及签名函数的名称,大伙能够本身去指定了。个人形式是这个样子的

[rpcinterface:myrpc]
supervisor.rpcinterface_factory = myrpc.rpc:my_rpc
args = 1

  

注意,第二行的args = 1。表示传入my_rpc这个签名函数的参数。supervisor中,签名函数的第一个参数必须为"supervisord",后面能够没有别的参数,以key/value的形式传入。

其余参数如同args = 1的形式,放在[rpcinterface:myrpc]的块里面

OK,咱们就用上面的配置,来举个小例子,来看看自定义rpc接口的完整实现。

先看看,myrpc.rpc,rpc.py这个自定义模块里面是什么?

#!/usr/bin/env python
 
class Rpc(object):
    def __init__(self,supervisord,args):
        self.supervisord = supervisord
        self.args = args
 
    def walk_args(self):
        return self.walk
 
def my_rpc(supervisord,**args):
     return Rpc(supervisord,args)

  启动supervisord以后,进行下面的操做

咱们的刚才定义的那个函数出来了,并且执行成功了。

OK,举了个小例子把流程走通了,没啥实际用处,深刻搞的话就看大伙的具体需求了。

 

 

本文出自 “小城运维” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1540795

相关文章
相关标签/搜索