python - 如何订阅所有进程的PROCESS_STATE_RUNNING事件

标签 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 状态时,我的事件监听器都会收到通知。然而,这种情况并非如此。当我使用 SIGINT 信号终止 theprogramname 时,Supervisor 会重新启动该进程,但我的监听器不会收到此通知。

为了实现我想要的目标,我是否缺少额外的配置?

最佳答案

这是因为您的监听器需要将“RESULT 2\nOK”响应发送回标准输出上的supervisord。

如果supervisord没有看到这个响应,它认为你的监听器还没有准备好,不会再发送任何事件。

尝试将其添加到 while 循环中:

listener.ok(sys.stdout)

这告诉监听器发送“OK”响应。

以下是 supervisor.childutils.listenerok 方法的源代码: https://github.com/Supervisor/supervisor/blob/3.0/supervisor/childutils.py#L61

关于python - 如何订阅所有进程的PROCESS_STATE_RUNNING事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17413914/

相关文章:

supervisord - 使用主管运行 flask 应用程序

python - pip 不能使用自定义 SSL 证书?

python - 如何在plotly3.6中对条形图进行排序?

python - Tornado - 应用程序和请求日志记录如何工作?

deployment - 如何使用supervisord部署tornado websocket多进程应用程序?

laravel - 无法重新启动 supervisor.service : Unit not found CentOS 7

php - Laravel 多个应用程序同一个服务器如果名称相同,队列会发生冲突吗?

Python,multiprocessing.pool 花费的时间与 for 循环大致相同

python - 如何使用 pandas.shift() 而不丢失数据?

python - 是否应该添加额外的层来支持 __repr__?