Supervisord能否调用node.js进程Health API或执行shell命令做健康检查
Supervisord 健康检查三类可行性问题解答
三类需求均可以实现,具体实现逻辑和方案如下:
1. 调用Node.js进程的Health API实现健康检查
Supervisord本身没有内置HTTP请求调用能力,但可以通过自定义脚本间接实现该需求:
- 编写自定义检查脚本(可使用Shell、Python、Node.js等任意语言),在脚本中调用目标Node.js进程暴露的Health API,校验返回状态码、响应内容是否符合预期
- 若检查判定服务异常,在脚本中调用
supervisorctl restart <目标进程名>指令完成进程重启 - 可通过定时任务、Supervisord事件监听器两种方式触发脚本执行
2. 借助Supervisord事件机制开发健康检查功能
该方案是Supervisord官方支持的原生扩展方式,实现的健康检查能力可以和Supervisord生命周期深度绑定:
- 基于Supervisord的事件监听协议开发自定义EventListener脚本,在脚本内实现健康检查逻辑
- 在Supervisord配置文件中注册该事件监听器,可通过监听
TICK_60类定时事件实现每N秒自动触发检查,也可监听PROCESS_STATE_RUNNING事件在目标进程启动后自动触发首次检查 - 检查异常时可直接通过Supervisord的XML-RPC接口或
supervisorctl指令操作进程状态
参考配置示例:
[eventlistener:custom_health_check]
command=python3 /opt/health_check/listener.py
events=PROCESS_STATE_RUNNING,TICK_60
user=appuser
autostart=true
3. 通过执行Shell命令的方式完成健康检查
该方案是落地成本最低的常用方案,有两种常见实现方式:
- 定时任务触发:将健康检查逻辑写为Shell脚本,配置crontab定时执行,检查不通过时调用
supervisorctl指令操作进程 - 事件监听器触发:在刚才提到的Supervisord EventListener脚本中调用Shell命令完成检查逻辑
Shell健康检查脚本示例:
#!/bin/bash # 检查目标Node.js服务健康接口状态 HTTP_CODE=$(curl -s -w "%{http_code}" http://127.0.0.1:3000/health -o /dev/null) if [ ${HTTP_CODE} -ne 200 ]; then # 异常时重启进程 supervisorctl restart nodejs_service fi
内容的提问来源于stack exchange,提问作者Sana.91
相关产品推荐
相关产品推荐

