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

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

脚本配置与启用

  1. 给脚本添加执行权限:
chmod +x suppress_alert.sh
  1. 配置crontab实现每5分钟自动运行:
    执行crontab -e打开定时任务编辑器,添加以下一行:
*/5 * * * * /实际路径/suppress_alert.sh

(替换/实际路径/为脚本所在的真实目录)

补充说明

  • 状态文件会自动创建,无需手动初始化
  • 若日志文件被轮转(比如logrotate),脚本会自动从新日志的开头开始读取,不会遗漏新告警
  • 测试时可手动修改状态文件中的行数,模拟有新日志的场景

内容的提问来源于stack exchange,提问作者manwithamission

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:43:13