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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:52:29