Shell脚本与钉钉机器人构建轻量级监控方案
发布时间:2026/10/26 6:24:06 锦皓数字建站

1. 为什么选择Shell脚本钉钉构建监控方案在企业级监控体系中Zabbix、Prometheus等专业方案固然功能强大但往往伴随着复杂的部署和维护成本。而Shell脚本配合钉钉机器人却能以极低的成本实现核心监控功能特别适合中小团队快速搭建轻量级监控体系。我在三家不同规模公司的运维实践中这套组合在以下场景表现尤为突出基础设施基础指标监控磁盘、CPU、内存阈值告警关键业务进程存活检查如Nginx、MySQL进程守护定时任务执行结果回调比邮件通知更及时CI/CD流水线节点通知构建结果实时推送钉钉机器人相比传统邮件/SMS通知有三个不可替代的优势一是API调用简单一条curl命令即可触发二是支持富文本格式Markdown/卡片消息三是移动端推送即时性强平均到达时间在3秒以内。而Shell脚本作为Unix/Linux系统的原生语言无需额外环境依赖是编写监控探针的理想选择。2. 监控方案核心架构设计2.1 技术组件拓扑[监控目标服务器] │ ├─ [Shell监控脚本] (crontab定时执行) │ ├─ 指标采集 (df, vmstat, ps等) │ └─ 阈值判断 (if/else条件分支) │ └─ [钉钉机器人Webhook] │ └─ [钉钉客户端] (移动端/PC端告警展示)2.2 关键脚本模块划分一个健壮的监控脚本应包含以下五个部分以磁盘监控为例#!/bin/bash # 1. 配置区 DINGTALK_WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_tokenYOUR_TOKEN THRESHOLD90 # 2. 指标采集函数 get_disk_usage() { df -h | awk /\/$/ {print $5} | tr -d % } # 3. 告警判断逻辑 check_threshold() { local usage$(get_disk_usage) if [ $usage -ge $THRESHOLD ]; then send_alert 磁盘使用率已达 ${usage}% fi } # 4. 通知发送函数 send_alert() { local message$1 curl -s $DINGTALK_WEBHOOK \ -H Content-Type: application/json \ -d { msgtype: text, text: { content: $message } } } # 5. 主执行流程 main() { check_threshold } main关键技巧在配置区集中管理所有变量便于后续维护。阈值判断建议使用-ge等数值比较运算符避免字符串比较的潜在问题。3. 钉钉机器人深度配置指南3.1 机器人创建与安全设置创建自定义机器人钉钉群设置 → 智能群助手 → 添加机器人 → 自定义建议命名包含监控目标如Prod-Server-Monitor安全策略选择三者选一自定义关键词消息中必须包含预设词如告警加签在Webhook后追加timestamp{time}sign{sign}IP白名单适用于固定出口IP的场景踩坑记录曾因未设置安全策略导致机器人被恶意调用建议生产环境至少启用一种防护措施。加签方式最安全但实现稍复杂推荐使用如下加签生成代码generate_sign() { local secret$1 local timestamp$(date %s%3N) local sign$(echo -n ${timestamp}\n${secret} | openssl dgst -sha256 -hmac $secret -binary | base64) echo timestamp$timestampsign$sign }3.2 消息模板进阶用法除基础文本消息外钉钉机器人还支持多种消息类型Markdown消息模板{ msgtype: markdown, markdown: { title: 内存告警, text: **服务器**192.168.1.1\n**时间**$(date %F %T)\n**内容**内存使用率95%\n[查看详情](http://monitor.example.com) } }ActionCard交互卡片带按钮跳转{ msgtype: actionCard, actionCard: { title: 服务异常告警, text: 订单服务响应超时, singleTitle: 立即处理, singleURL: http://ops.example.com/alert/123 } }实测发现Markdown消息的阅读体验最佳但要注意标题限制100字符正文限制5000字符链接需使用标准格式[描述](URL)不支持嵌套列表和复杂表格4. Shell监控脚本的工业级实践4.1 指标采集的可靠性保障磁盘监控的常见陷阱# 错误示例只监控根分区 df -h | grep /dev/sda1 # 正确做法监控所有挂载点 df -h | awk NR1 {print $6,$5} | tr -d %内存监控的特殊处理# 使用free命令时建议显示buff/cache后的真实使用率 real_mem_used() { free | awk /Mem:/ { used $3 - $6 - $7 # total_used - buffers - cached total $2 printf %.0f, (used/total)*100 } }4.2 多条件复合告警策略通过状态码组合实现分级告警check_services() { local nginx_status$(pgrep nginx | wc -l) local mysql_status$(systemctl is-active mysql) if [ $nginx_status -eq 0 ]; then send_alert 紧急Nginx进程不存在 return 2 elif [ $mysql_status ! active ]; then send_alert 严重MySQL服务异常 return 1 fi return 0 }4.3 日志与告警去重机制避免瞬时故障导致告警风暴ALERT_LOG/var/log/monitor_alert.log should_alert() { local alert_key$1 local last_alert_time$(grep $alert_key $ALERT_LOG | tail -1 | cut -d -f1) if [ -z $last_alert_time ] || [ $(($(date %s) - last_alert_time)) -gt 3600 ]; then echo $(date %s) $alert_key $ALERT_LOG return 0 fi return 1 }5. 生产环境部署方案5.1 目录结构规范建议按以下结构组织监控体系/etc/monitor/ ├── bin/ # 可执行脚本 │ ├── disk_monitor.sh │ └── service_check.sh ├── config/ # 配置文件 │ └── dingtalk.cfg # WEBHOOK配置 └── logs/ # 运行日志 ├── disk.log └── service.log5.2 Crontab配置要点# 每5分钟检查磁盘随机延迟避免并发 */5 * * * * sleep $((RANDOM\%60)) /etc/monitor/bin/disk_monitor.sh /etc/monitor/logs/disk.log 21 # 每小时检查服务状态 0 * * * * /etc/monitor/bin/service_check.sh /etc/monitor/logs/service.log 21重要经验通过sleep $((RANDOM\%60))让监控任务随机延迟启动避免所有服务器同时发起告警导致通知拥堵。5.3 监控脚本自保护机制添加以下逻辑防止脚本堆积# 检查已有实例是否运行 LOCK_FILE/tmp/${0##*/}.lock exec 200$LOCK_FILE flock -n 200 || exit 1 # 设置超时自动退出 timeout 60s /path/to/script.sh6. 高阶应用场景拓展6.1 与Zabbix集成实现二级通知当Zabbix触发告警时通过Shell脚本调用钉钉#!/bin/bash # zabbix_to_dingtalk.sh ALERT_SUBJECT$1 ALERT_MESSAGE$2 curl -s $DINGTALK_WEBHOOK \ -H Content-Type: application/json \ -d { msgtype: markdown, markdown: { title: Zabbix告警, text: **主题**$ALERT_SUBJECT\n**详情**\n$ALERT_MESSAGE } }6.2 实现告警确认机制通过钉钉消息按钮触发后续处理send_confirmable_alert() { local alert_id$(uuidgen) curl -s $DINGTALK_WEBHOOK \ -H Content-Type: application/json \ -d { msgtype: actionCard, actionCard: { title: MySQL主从异常, text: 从库延迟超过300秒, btns: [ { title: 已处理, actionURL: http://ops.example.com/confirm?alert_id$alert_id } ] } } # 将alert_id存入数据库等待回调 }6.3 监控数据可视化方案虽然Shell脚本不适合直接做数据分析但可以通过以下方式实现简单可视化脚本采集数据写入CSVecho $(date %F %T),$(get_disk_usage) /var/log/disk_usage.csv使用PythonMatplotlib生成日报import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(/var/log/disk_usage.csv, names[time,usage]) plt.plot(df[time], df[usage]) plt.savefig(/tmp/disk_report.png)通过钉钉发送图片curl -s $DINGTALK_WEBHOOK \ -H Content-Type: application/json \ -d { msgtype: markdown, markdown: { title: 磁盘使用日报, text:  } }在实际运维中这套Shell钉钉的组合已经帮我及时发现了数十次潜在故障。有一次凌晨3点收到磁盘告警及时清理日志避免了生产事故。建议所有脚本都添加-x选项记录执行日志#!/bin/bash -x这对后期排查问题非常有帮助。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。