【问题标题】:supervisord stop/start all process but exclude X and Y processessupervisord 停止/启动所有进程,但不包括 X 和 Y 进程
【发布时间】:2012-12-20 16:50:36
【问题描述】:

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

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

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

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

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

这比做要好得多:

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

任何帮助将不胜感激!

谢谢

【问题讨论】:

    标签: python distributed supervisord xmlrpclib


    【解决方案1】:

    supervisord 中的 XML-RPC 服务器支持system.multicall() endpoint。使用它来发送stopProcess 呼叫的,使用MultiCall XML-RPC proxy

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

    其中serverproxysupervisord 服务器的XML-RPC 代理。调用将作为一个 HTTP 请求发送并在服务器上进行串行处理,不会比stopAllProcesses() 快或慢;后者在内部为每个找到的进程调用stopProcess

    【讨论】:

    • 感谢您的回复 - 肯定到了,我得到了一个 {'results': [{'faultCode': 1, 'faultString': ":' stopProcess'"}]} - 似乎不喜欢 'stopProcess' 位
    • @user1741694:简单地通过 XML-RPC 调用 stopProcess() 对你有用吗?
    • @user1741694:啊,我怀疑需要包含命名空间; multicall.supervisor.stopProcess(proc) 应该这样做。
    【解决方案2】:

    你有一个所有进程名称的列表:

    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(如果可能)以使用包含/排除在一次调用中处理一系列进程。

    【讨论】:

    • 这是我试图摆脱的,因为我可能有 100 个进程,因此需要进行 100 次调用 - 不理想。我找到了一个名为 multicall(calls) 的方法 - 但我仍在尝试弄清楚如何使用它...
    猜你喜欢
    • 2012-02-23
    • 2013-09-26
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2012-09-05
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多