Monit执行reload、start all后阻塞无法正确显示服务状态如何解决
问题原因
你遇到的阻塞不属于Monit故障,是5.25.3版本的固有设计逻辑导致的:
Monit执行start类命令时默认会同步等待目标服务的校验条件(你这里是apache的pid文件存在)通过,单服务默认的校验超时时间为24秒,和你观测到的阻塞时长完全匹配。由于monit start all是串行处理所有服务的启动任务,apache的校验会一直卡到超时才会结束,后续服务的启动处理被推迟,直接错过30秒的轮询窗口,因此会统一显示start pending状态。
你日志中反复输出的pidfile '/var/run/apache2/apache2.pid' does not exist,就是Monit在超时窗口内循环校验apache状态的日志记录。
解决方案
可以通过以下几种方式规避阻塞问题:
- 调整apache的监控配置,缩短启动超时阈值:在apache对应的Monit配置块中添加
start timeout = 5 seconds(可根据apache实际启动耗时调整数值),减少单服务的最大等待时长,避免阻塞后续服务处理。 - 拆分启动命令,避免全量启动:如果apache允许处于未激活状态,可在apache的配置块中添加
mode manual参数,这样monit start all会自动跳过apache的启动流程,不会触发校验阻塞;也可以单独执行monit start <除apache外的服务名>的方式先启动其他服务,最后按需处理apache。 - 升级Monit版本:5.26.0及以上版本优化了服务启动调度逻辑,新增了非依赖服务的并行处理能力,同时优化了pid不存在场景下的校验退避逻辑,升级后可基本消除这类单服务阻塞全队列的问题。
- 调整全局超时阈值:在
/etc/monitrc全局配置中添加如下配置,缩短全局服务校验的最大超时时间:set limits { programOutputTimeout = 10 seconds, servicePollTimeout = 10 seconds }
内容的提问来源于stack exchange,提问作者Drasko Jagodic
相关产品推荐
相关产品推荐

