Linux定时告警脚本需求:避免重复发送已告警日志内容
解决方案
核心思路
通过维护一个状态记录文件,保存上次读取日志的位置(最后处理的日志行号),每次运行脚本时仅处理该位置之后的新日志内容,彻底避免重复发送已推送过的告警信息。
具体脚本实现
创建名为suppress_alert.sh的脚本,内容如下:
#!/bin/bash # 配置参数 LOG_FILE="/var/log/message" ALERT_KEYWORD="suppress" EMAIL="test@hotmail.com" SUBJECT="suppress 告警" # 状态文件,记录上次读取到的日志行数 STATUS_FILE="/var/tmp/suppress_alert_last_pos" # 初始化状态文件:如果不存在,记录当前日志总行数 if [ ! -f "$STATUS_FILE" ]; then wc -l "$LOG_FILE" | awk '{print $1}' > "$STATUS_FILE" fi # 读取上次处理的行数和当前日志总行数 LAST_LINE=$(cat "$STATUS_FILE") CURRENT_LINE=$(wc -l "$LOG_FILE" | awk '{print $1}') # 检查是否有新日志行 if [ "$CURRENT_LINE" -gt "$LAST_LINE" ]; then # 提取新日志并筛选告警关键字 NEW_ALERTS=$(sed -n "$((LAST_LINE + 1)),$CURRENT_LINE p" "$LOG_FILE" | grep "$ALERT_KEYWORD") # 有匹配内容则发送邮件 if [ -n "$NEW_ALERTS" ]; then echo "$NEW_ALERTS" | mail -s "$SUBJECT" "$EMAIL" fi # 更新状态文件为当前总行数 echo "$CURRENT_LINE" > "$STATUS_FILE" fi
脚本配置与启用
- 给脚本添加执行权限:
chmod +x suppress_alert.sh
- 配置crontab实现每5分钟自动运行:
执行crontab -e打开定时任务编辑器,添加以下一行:
*/5 * * * * /实际路径/suppress_alert.sh
(替换/实际路径/为脚本所在的真实目录)
补充说明
- 状态文件会自动创建,无需手动初始化
- 若日志文件被轮转(比如logrotate),脚本会自动从新日志的开头开始读取,不会遗漏新告警
- 测试时可手动修改状态文件中的行数,模拟有新日志的场景
内容的提问来源于stack exchange,提问作者manwithamission
相关产品推荐
相关产品推荐

