我试图通过xmlrpc与supervisor
交谈。基于supervisorctl
(尤其是this line),我有以下内容,它似乎应该可以工作,并且确实有效,只要它足够连接以从服务器接收错误:
#socketpath is the full path to the socket, which exists
# None and None are the default username and password in the supervisorctl options
In [12]: proxy = xmlrpclib.ServerProxy('http://127.0.0.1', transport=supervisor.xmlrpc.SupervisorTransport(None, None, serverurl='unix://'+socketpath))
In [13]: proxy.supervisor.getState()
导致此错误:
---------------------------------------------------------------------------
ProtocolError Traceback (most recent call last)
/home/marcintustin/webapps/django/oneclickcosvirt/oneclickcos/<ipython-input-13-646258924bc2> in <module>()
----> 1 proxy.supervisor.getState()
/usr/local/lib/python2.7/xmlrpclib.pyc in __call__(self, *args)
1222 return _Method(self.__send, "%s.%s" % (self.__name, name))
1223 def __call__(self, *args):
-> 1224 return self.__send(self.__name, args)
1225
1226 ##
/usr/local/lib/python2.7/xmlrpclib.pyc in __request(self, methodname, params)
1576 self.__handler,
1577 request,
-> 1578 verbose=self.__verbose
1579 )
1580
/home/marcintustin/webapps/django/oneclickcosvirt/lib/python2.7/site-packages/supervisor/xmlrpc.pyc in request(self, host, handler, request_body, verbose)
469 r.status,
470 r.reason,
--> 471 '' )
472 data = r.read()
473 p, u = self.getparser()
ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>
这是unix_http_server
的{{1}}部分:
supervisord.conf
因此,应该没有身份验证问题。
似乎我的代码在所有重要方面与[unix_http_server]
file=/home/marcintustin/webapps/django/oneclickcosvirt/tmp/supervisor.sock ; (the path to the socket file)
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
中的等效代码相同,但supervisorctl
实际上有效。我做错了什么?
答案 0 :(得分:7)
您的代码看起来非常正确。我正在使用Python 2.7运行Supervisor 3.0,并给出以下内容:
import supervisor.xmlrpc
import xmlrpclib
p = xmlrpclib.ServerProxy('http://127.0.0.1',
transport=supervisor.xmlrpc.SupervisorTransport(
None, None,
'unix:///home/lars/lib/supervisor/tmp/supervisor.sock'))
print p.supervisor.getState()
我明白了:
{'statename': 'RUNNING', 'statecode': 1}
您确定正在运行的Supervisor实例正在使用您认为的配置文件吗?如果在调试模式下运行supervisord
,您会看到连接吗?
答案 1 :(得分:1)
我不使用xmlrpclib中的ServerProxy,而是使用Server类,而不必定义任何传输或路径到套接字。不确定您的目的是否需要,但这是一个我经常使用的瘦客户端。它几乎直接来自文档。
python -c "import xmlrpclib;\
supervisor_client = xmlrpclib.Server('http://localhost:9001/RPC2');\
print( supervisor_client.supervisor.stopProcess(<some_proc_name>) )"