我在用着主管的事件框架 http://supervisord.org/events.html订阅由 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()
In my 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
with a SIGINT
信号,该进程由主管重新启动,但我的侦听器没有收到通知。
为了实现我想要的目标,我是否缺少额外的配置?
这是因为您的侦听器需要将“RESULT 2\nOK”响应发送回标准输出上的supervisord。
如果supervisord没有看到这个响应,它认为你的监听器还没有准备好,并且不会发送任何更多的事件。
尝试将其添加到 while 循环中:
listener.ok(sys.stdout)
这告诉监听者发送“OK”响应。
这是ok
中的方法supervisor.childutils.listener
:
https://github.com/Supervisor/supervisor/blob/3.0/supervisor/childutils.py#L61 https://github.com/Supervisor/supervisor/blob/3.0/supervisor/childutils.py#L61
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)