如何配置Monit触发loadavg告警时附带top进程快照?
解决方案:在Monit Loadavg告警中附加Top进程快照
针对CentOS 7上的Monit v5.14,你完全不需要禁用原有告警,只需要扩展现有告警的动作,让它在触发时自动执行top命令并将输出附加到告警邮件里。以下是具体操作步骤:
1. 找到并编辑Monit系统监控配置
打开你的Monit主配置文件(通常是/etc/monitrc)或者单独的系统监控配置文件(比如/etc/monit.d/system),找到监控系统loadavg的配置段,原有内容大概是这样的:
check system localhost if loadavg (1min) > 4 then alert if loadavg (5min) > 2 then alert
2. 扩展告警规则,添加Top快照命令
直接在原有告警规则下追加exec指令,让Monit触发告警时自动执行top命令并捕获输出:
check system localhost if loadavg (1min) > 4 then alert exec "/bin/echo '=== Top 20 CPU占用进程 ===' && /usr/bin/top -b -n 1 -o %CPU | head -25" if loadavg (5min) > 2 then alert exec "/bin/echo '=== Top 20 CPU占用进程 ===' && /usr/bin/top -b -n 1 -o %CPU | head -25"
这里的参数说明:
-b:让top以批处理模式运行,避免交互式输出问题-n 1:只生成一次进程快照,不需要持续输出-o %CPU:按CPU使用率从高到低排序进程head -25:截取前25行(包含top自带的系统信息行,实际能显示约20个进程)
如果想查看内存占用最高的进程,把-o %CPU换成-o %MEM即可。
3. (可选)自定义全局告警邮件格式
如果希望所有告警的邮件风格更统一,可以在Monit全局配置中定义邮件模板,自动把命令输出插入到固定位置:
set alert your-email@example.com with mail-format { subject: Monit告警: $HOST发生$EVENT message: | **告警详情** - 事件类型: $EVENT - 关联服务: $SERVICE - 主机地址: $HOST - 触发时间: $DATE - 描述信息: $DESCRIPTION **触发时刻进程快照** $EXECUTEOUTPUT }
这样配置后,所有带exec指令的告警都会自动把命令输出填充到$EXECUTEOUTPUT的位置。
4. 验证配置并重启Monit
- 先检查配置语法是否正确:
monit -t - 如果输出
Control file syntax OK,就重新加载Monit配置:systemctl reload monit
关键注意事项
- 这个方式不会生成额外告警,只是在原有告警邮件中附加进程快照内容,完全符合你的需求
- 确保top命令的路径正确(CentOS 7中默认是
/usr/bin/top,可以用which top确认) - 如果需要更复杂的快照(比如同时展示CPU和内存占用Top进程),可以把命令写到Shell脚本里,例如:
保存为#!/bin/bash echo "=== Top 20 CPU占用进程 ===" /usr/bin/top -b -n 1 -o %CPU | head -25 echo -e "\n=== Top 20内存占用进程 ===" /usr/bin/top -b -n 1 -o %MEM | head -25/usr/local/bin/monit-process-snapshot.sh,赋予执行权限chmod +x /usr/local/bin/monit-process-snapshot.sh,然后把Monit里的exec改为:exec "/usr/local/bin/monit-process-snapshot.sh"
内容的提问来源于stack exchange,提问作者AWeber
相关产品推荐
相关产品推荐

