You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:08:57