如何为所有进程订阅PROCESS_STATE_RUNNING事件

时间:2013-07-01 21:19:58

标签: python supervisord

我正在使用Supervisor's events framework订阅Supervisor管理的进程中的事件。

我的事件监听器processlistener.py看起来像这样:

import sys

from supervisor.childutils import listener

def write_stdout(s):
    sys.stdout.write(s)
    sys.stdout.flush()


def write_stderr(s):
    sys.stderr.write(s)
    sys.stderr.flush()


def main():
    while True:
        headers, body = listener.wait(sys.stdin, sys.stdout)
        body = dict([pair.split(":") for pair in body.split(" ")])

        write_stderr("Headers: %r\n" % repr(headers))
        write_stderr("Body: %r\n" % repr(body))

        if headers["eventname"] == "PROCESS_STATE_RUNNING":
            write_stderr("Process state running...\n")


if __name__ == '__main__':
    main()

在我的supervisord.conf中,我有:

[program:theprogramname]
command=/bin/cat              ; the program (relative uses PATH, can take args)
process_name=%(program_name)s_%(process_num)s ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)

[eventlistener:theeventlistenername]
command=python processlistener.py    ; the program (relative uses PATH, can take args)
process_name=%(program_name)s_%(process_num)s       ; process_name expr (default %(program_name)s)
numprocs=1                           ; number of processes copies to start (def 1)
events=PROCESS_STATE_RUNNING         ; event notif. types to subscribe to (req'd)

使用此配置,我希望每当Supervisor管理的进程进入RUNNING状态时,都会通知我的事件监听器。然而,这种情况并非如此。当我用theprogramname信号杀死SIGINT时,主管会重新启动该过程,但我的听众不会收到通知。

为了达到我的目的,我是否错过了额外的配置?

1 个答案:

答案 0 :(得分:3)

这是因为你的听众需要在stdout上向supervisord发送'RESULT 2 \ nOK'回复。

如果supervisord没有看到此回复,则认为您的听众没有准备好,也不会再发送任何事件。

尝试在while循环中添加:

listener.ok(sys.stdout)

这告诉听众发送'OK'回复。

以下是oksupervisor.childutils.listener方法的来源: https://github.com/Supervisor/supervisor/blob/3.0/supervisor/childutils.py#L61