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,举了个小例子把流程走通了,没啥实际用处,深入搞的话就看大伙的具体需求了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值