我正试图在一次XMLRPC调用中停止在由Supervisord管理的远程服务器上运行的大约20个服务。
但是,我想从中排除某些进程,如果我可以按照以下方式执行某些操作会很棒:
stopAllProcesses(exclude=["monitorapp","nagios"])
或者,我确实列出了所有可用的进程,所以即使执行以下操作也比实际停止所有服务或进行20次单独调用更好:
stopProcess(["process1","process2","process3"])
这比做得好:
stopProcess("process1")
stopProcess("process2")
stopProcess("process3")
非常感谢任何帮助!
由于
答案 0 :(得分:1)
supervisord
中的XML-RPC服务器支持system.multicall()
endpoint。使用MultiCall
XML-RPC proxy发送stopProcess
个multicall = xmlrpclib.MultiCall(serverproxy)
for proc in procs:
if proc in exclude:
continue
multicall.supervisor.stopProcess(proc)
res = multicall()
来电组:
serverproxy
其中supervisord
是stopAllProcesses()
服务器的XML-RPC代理。这些调用将作为一个HTTP请求发送,并在服务器上串行处理,不会比stopProcess
更快或更慢;无论如何,后者内部调用{{1}}来查找每个进程。
答案 1 :(得分:0)
您有一个所有进程名称的列表:
procs = ['monitorapp', 'nagios', 'process1', 'process2', 'process3']
以及要排除的进程名称列表:
exclude = ['monitorapp', 'nagios']
你可以一次打电话给他们......
这将为不在排除列表中的每个进程调用'stopProcess()':
stop_procs = [p for p in procs if p not in exclude]
for proc in stop_procs:
stopProcess(proc)
更好的方法是重构API(如果可能的话)来处理一个带有include / exclude的调用中的进程列表。