为何supervisord事件监听器仅捕获自身事件?
问题分析与解决方案
你的问题核心出在事件监听器的协议响应格式错误,导致Supervisor无法正确识别监听器的ACK响应,进而反复重启监听器,所以你只能看到监听器自身的启动事件,而无法捕获scheduler的崩溃事件。
具体问题点
看你的监听器代码最后一行:
write_stdout('RESULT 2\nOK')
Supervisor的事件监听器协议要求,每个发送给stdout的消息必须以换行符(\n)结尾。这里的OK后面没有添加换行,Supervisor无法正确解析这个响应,会判定监听器异常,随即重启它——这就是你日志里反复出现PROCESS_STATE_STARTING len:70 processname:mylistener的原因。
修复步骤
修改监听器代码的最后一行,给OK加上换行:
write_stdout('RESULT 2\nOK\n')
额外验证
你的supervisor.cfg配置本身没有问题:
- 事件列表
events=PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED,...已经覆盖了你需要捕获的进程状态事件 - scheduler的配置也正确(会自动重启,符合你说的“每分钟崩溃一次”的场景)
修复代码后,重启Supervisor:
sudo supervisorctl reload
之后就能正常捕获scheduler的崩溃(PROCESS_STATE_EXITED/PROCESS_STATE_STOPPED)事件了。
调试小技巧
如果之后还有问题,可以查看Supervisor的主日志(/var/log/supervisor/supervisord.log),里面会记录监听器的异常信息,帮助你更快定位问题。
内容的提问来源于stack exchange,提问作者Dmytro T
相关产品推荐
相关产品推荐

