2

我试图在一个 XMLRPC 调用中停止在由 Supervisord 管理的远程服务器上运行的大约 20 个服务。

但是,我想从中排除某些过程,如果我可以按照以下方式做一些事情会很棒:

stopAllProcesses(exclude=["monitorapp","nagios"])

或者,我确实有一个所有可用进程的列表,因此即使执行以下操作也比实际停止所有服务或执行 20 个单独调用要好:

stopProcess(["process1","process2","process3"])

这比这样做要好得多:

stopProcess("process1")
stopProcess("process2")
stopProcess("process3")

任何帮助将不胜感激!

谢谢

4

2 回答 2

1

中的 XML-RPC 服务器supervisord支持system.multicall()端点使用XML-RPC 代理发送一stopProcess调用:MultiCall

multicall = xmlrpclib.MultiCall(serverproxy)
for proc in procs:
    if proc in exclude:
        continue
    multicall.supervisor.stopProcess(proc)
res = multicall()

serverproxy服务器的 XML-RPC 代理在哪里supervisord。这些调用将作为一个 HTTP 请求发送,并在服务器上串行处理,不会比stopAllProcesses();快或慢。后者在内部调用stopProcess无论如何找到的每个进程。

于 2012-12-20T21:09:04.433 回答
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(如果可能)以使用包含/排除在一次调用中处理进程列表。

于 2012-12-20T18:16:23.293 回答