如何在Bash脚本中获取MySQL查询结果并触发邮件告警
获取MySQL查询结果并触发端口告警邮件
我来帮你完善这个监控脚本,核心要解决两个问题:提取纯数值的查询结果,以及基于数值触发邮件告警。以下是完整的可运行方案:
完整改进脚本
#!/usr/bin/bash # 数据库配置(注意:明文密码不安全,后面会说优化方案) DB_USER="DB_USER" DB_NAME="DB_NAME" DB_PASS="PASSWORD" # 执行MySQL查询,直接提取纯数值结果 event_count=$(mysql -u "$DB_USER" -p"$DB_PASS" -N -B "$DB_NAME" <<MY_QUERY SELECT COUNT(message) FROM devices, eventlog WHERE sysName = 'sysName' AND message = 'ifOperStatus: up -> down' AND datetime >= NOW() - INTERVAL 15 MINUTE; MY_QUERY ) # 判断计数是否达标,触发告警 if [ "$event_count" -ge 2 ]; then # 发送告警邮件(需系统已配置邮件服务,比如postfix) alert_content="告警通知:交换机sysName的端口在最近15分钟内出现${event_count}次up->down状态切换!" echo "$alert_content" | mail -s "交换机端口状态异常告警" admin@your-domain.com fi
关键细节解释
1. 如何获取干净的数值结果
你之前的输出带表头COUNT(message),这会干扰变量判断,所以我们给MySQL命令加了两个参数:
-N:关闭表头输出,直接返回纯数字-B:启用批处理模式,避免输出多余的格式(比如换行、空格),确保变量里只存数字
用$(...)把命令执行结果赋值给event_count变量,这是Bash里捕获命令输出的标准方式。
2. 安全优化:避免明文密码
直接在脚本里写密码风险很高,建议把数据库凭据放到~/.my.cnf文件中,权限设为600(只有自己能读):
[client] user=DB_USER password=PASSWORD database=DB_NAME
之后脚本里的MySQL命令可以简化成:
event_count=$(mysql -N -B <<MY_QUERY # 这里写查询语句 MY_QUERY )
这样就不用在脚本里暴露密码了。
3. 邮件发送的注意事项
- 脚本里用了
mail命令,需要你的服务器已经配置好邮件服务(比如Postfix、Sendmail),否则邮件发不出去。 - 可以自定义邮件标题和内容,比如加上具体的交换机名称、时间戳,方便管理员快速定位问题。
4. 调试小技巧
如果不确定变量是否正确获取,可以在赋值后加一行:
echo "最近15分钟内的事件次数:$event_count"
运行脚本就能看到结果,方便排查问题。
内容的提问来源于stack exchange,提问作者Hasan Eren
相关产品推荐
相关产品推荐

