supervisor(三)xml_rpc
supervisor提供的两种管理方式,supervisorctl和web其实都是通过xml_rpc来实现的。 xml_rpc其实就是本地可以去调用远端的函数方法,然后函数方法经过一番处理后,把结果返回给我们。 xml_rpc不懂的同学建议去百度百度它的原理机制。这个比较简单,楼主也是上午刚搞懂。 在python里面实现xml_rpc就更加的简单,用SimpleXMLRPCServer和xmlrpclib这两个模块就可以分别实现服务端和客户端了。 调用supervisor的xml_rpc接口,其实很简单。先做好下面这两步 importxmlrpclib p=xmlrpclib.Server('http://localhost:9001/RPC2') 注意xmlrpclib.Server()里面的url和咱们supervisor.conf里的配置是相关的 做完上面的步骤,我们就可以得到一个叫做p的对象。p这个对象,有很多存放在服务端的方法。 supervisor默认的xml_rpc方法定义在下面这个路径里面 /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/envpython classRpc(object): def__init__(self,supervisord,args): self.supervisord=supervisord self.args=args defwalk_args(self): returnself.walk defmy_rpc(supervisord,**args): returnRpc(supervisord,args) 启动supervisord之后,进行下面的操作 OK,举了个小例子把流程走通了,没啥实际用处,深入搞的话就看大伙的具体需求了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Swift开发教程--Unused variable 'fileName'问题的
- ruby – 如何在没有机器人的情况下使用Telegram API?
- postgresql中是否有类似的函数用于mysql的SQL_CALC_FOUND_R
- Flex异常处理 机制 设计
- WPF TextBox实现按字节长度限制输入功能
- ruby-on-rails-3 – 在paper_trail版本表中存储user_id
- ruby-on-rails – Rails – 如何声明attr_accessible多重角
- blazeDS 调用服务器方法返回值问题
- LINQ To XML Tutorials with Examples
- c – 基于模板参数有条件地定义模板类的构造函数