如何让Monit在状态变更时更频繁轮询?及进程依赖启停配置问题
用Monit配置协同进程的依赖启停与状态变更高频轮询
嘿,我来帮你搞定Monit的这两个需求——进程协同启停的依赖配置,以及状态变更时的高频轮询设置!
一、配置进程依赖与严格启停顺序
Monit的depends on指令正好能帮你实现进程间的依赖关联,而且它会自动处理启停顺序:启动时从最底层依赖开始往上启动,停止时从最上层服务往下停止,完全符合你的需求。
配置示例(按依赖层级排序)
你需要按照基础依赖→中间服务→顶层服务的顺序编写配置,这样Monit才能正确识别依赖链:
# 1. 最底层依赖:site-redis check process site-redis with pidfile /var/run/site-redis.pid start program = "/usr/bin/systemctl start site-redis" stop program = "/usr/bin/systemctl stop site-redis" if failed port 6379 then restart if 5 restarts within 5 cycles then timeout # 2. 中间层:site.workerA(依赖site-redis) check process site.workerA with pidfile /var/run/site.workerA.pid start program = "/usr/bin/systemctl start site.workerA" stop program = "/usr/bin/systemctl stop site.workerA" depends on site-redis # 声明依赖redis if failed port 8081 then restart if 5 restarts within 5 cycles then timeout # 3. 中间层:site.workerB(依赖site-redis) check process site.workerB with pidfile /var/run/site.workerB.pid start program = "/usr/bin/systemctl start site.workerB" stop program = "/usr/bin/systemctl stop site.workerB" depends on site-redis # 声明依赖redis if failed port 8082 then restart if 5 restarts within 5 cycles then timeout # 4. 顶层服务:site(依赖所有下层服务) check process site with pidfile /var/run/site.pid start program = "/usr/bin/systemctl start site" stop program = "/usr/bin/systemctl stop site" depends on site.workerA, site.workerB, site-redis # 声明所有依赖 if failed port 80 then restart if 5 restarts within 5 cycles then timeout
启停逻辑说明
- 启动
site时:Monit会先检查site-redis是否运行,没运行就启动它;接着启动site.workerA和site.workerB;最后启动site。 - 停止
site时:Monit会先停止site,再停止site.workerA和site.workerB,最后停止site-redis。 - 如果某个依赖服务故障重启,Monit会自动重启所有依赖它的上层服务(比如redis挂了,worker和site都会被重启)。
二、状态变更时的高频轮询设置
默认Monit用全局轮询间隔检查服务,但你可以针对服务状态变更的场景,临时缩短轮询间隔,更快地确认服务恢复或故障状态。
两种实现方式
1. 全局配置+服务级临时轮询
先在Monit的全局配置里设置默认轮询间隔,然后在每个服务块里添加状态变更后的高频轮询规则:
# 全局默认轮询间隔(比如60秒) set daemon 60 # 在每个服务块里添加以下规则(以site-redis为例) check process site-redis with pidfile /var/run/site-redis.pid # ... 其他配置 ... # 状态变更后,每10秒轮询一次,持续5个周期后恢复默认间隔 if changed then poll 10 cycles 5
2. 针对特定状态的高频轮询
如果你只想在服务故障(比如端口不通)时才提高轮询频率,可以这样写:
check process site with pidfile /var/run/site.pid # ... 其他配置 ... # 当服务状态变为"failed"时,每5秒轮询一次 if failed port 80 then poll 5 # 当服务恢复正常后,回到默认轮询间隔 if recovered then poll 60
注意事项
poll <interval>里的单位是秒,cycles <n>表示持续n次轮询后恢复默认间隔。- 不要把临时轮询间隔设得太小(比如1秒),否则会给系统带来不必要的负载。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

