別人博客轉載,作個記錄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