zoukankan      html  css  js  c++  java
  • supervisor(三)xml_rpc

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

    xml_rpc其实就是本地可以去调用远端的函数方法,然后函数方法经过一番处理后,把结果返回给我们。

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

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

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

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

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

    做完上面的步骤,我们就可以得到一个叫做p的对象。p这个对象,有很多存放在服务端的方法。

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

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

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

    1
    2
    >>>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)去查看,例如:

    1
    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中怎么定义吧。配置文件中找个地方,放入下面这么段东西。里面具体的接口名称,路径,及签名函数的名称,大伙可以自己去指定了。我的形式是这个样子的

    1
    2
    3
    [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这个自定义模块里面是什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/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之后,进行下面的操作

    wKiom1Pt7-nyccuFAADopgpm0y4443.jpg看到了吧,我们的刚才定义的那个函数出来了,而且执行成功了。

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

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/felixzh/p/6100004.html
Copyright © 2011-2022 走看看