Supervisor的事件机制是其3.0版本引入的高级特性,主要用于进程状态变化的监控和告警。以下是核心要点:
一、事件机制概述
- 基本原理:Supervisor在工作时会生成各种类型的事件通知,通过
eventlistener
实现订阅和处理 - 工作模式:采用发布-订阅模型,即使没有配置listener,事件也会生成;配置listener后才能接收处理
二、事件类型分类
Supervisor支持27种事件类型,主要分为:
- 进程状态事件:
•PROCESS_STATE_STARTING
:进程启动中
•PROCESS_STATE_RUNNING
:进程运行中
•PROCESS_STATE_EXITED
:进程退出(可区分正常/异常退出)
•PROCESS_STATE_FATAL
:进程启动失败且达到重试上限 - 日志事件:
•PROCESS_LOG_STDOUT
:标准输出日志
•PROCESS_LOG_STDERR
:错误输出日志 - 定时事件:
•TICK_60
:每60秒触发一次
三、事件监听器配置
[eventlistener:mylistener]
command=/path/to/listener.py # 监听器程序路径
events=PROCESS_STATE_EXITED,TICK_60 # 监听的事件类型
buffer_size=10 # 事件缓冲区大小
autostart=true
autorestart=true
四、监听器实现要点
- 通信协议:
• 通过stdin接收事件,stdout返回处理结果
• 消息格式包含header和payload,header包含事件类型和payload长度 - 状态管理:
•READY
:准备接收事件
•BUSY
:处理事件中
• 处理完成后需返回RESULT 2\nOK
或RESULT 4\nFAIL
五、Python实现示例
import sys
from supervisor import childutils
def main():
while True:
headers, payload = childutils.listener.wait()
# 处理事件逻辑
childutils.listener.ok() # 返回处理成功
if __name__ == '__main__':
main()
六、典型应用场景
- 进程异常退出告警
- 进程启动时执行依赖任务
- 状态同步到外部监控系统
- 定时任务触发
七、注意事项
- 监听器不能使用
stdout_capture_maxbytes
配置 - 多个事件类型用逗号分隔
- 建议设置合理的
buffer_size
防止事件丢失
通过事件机制,Supervisor实现了更灵活的进程监控能力,特别适合需要实时响应状态变化的运维场景。