AWK 系统监控与报警

《AWK 系统监控与报警》


🎯 学习目标

  • 掌握使用 AWK 对系统日志、资源使用情况(CPU、内存、磁盘)进行实时分析
  • 能够编写脚本识别异常行为(如登录失败、OOM 杀死进程、高负载)
  • 实现基于文本的简易“报警”机制(输出到终端、发送邮件、写入文件)
  • 理解如何在不同 Linux 发行版(Ubuntu、CentOS、EulerOS)中适配日志格式和路径差异
  • 提升自动化运维能力,为构建轻量级监控工具打下基础

🔑 核心重点

类别 内容
监控对象 CPU 使用率、内存占用、磁盘空间、登录尝试、OOM 杀死进程
数据来源 /proc 文件系统、topfreedf、日志文件(如 /var/log/syslog, dmesg
常用函数 match(), substr(), index(), system()
报警方式 终端输出、写入日志文件、调用 mailsendmail 发送邮件
注意事项 不同发行版日志路径差异;权限问题影响读取;awk/gawk 兼容性

📚 详细讲解


一、为什么用 AWK 做系统监控?

虽然我们可以使用 Prometheus、Zabbix、Telegraf 这类专业监控工具,但在以下场景中,AWK 是一个轻量而高效的替代方案:

  • 快速搭建临时监控脚本
  • 在受限环境中(无网络、无安装权限)运行
  • 配合 cron 定时检查并报警
  • 搭建最小化告警逻辑,无需复杂配置

AWK 的优势在于它能快速解析文本输出,提取关键指标,并根据条件触发响应。


二、实战案例:监控 SSH 登录失败次数并报警

🧪 场景:每分钟检测一次认证日志,发现超过 5 次失败登录即提示

#!/bin/bash
# monitor_ssh_login.sh

LOG_FILE="/var/log/auth.log"
THRESHOLD=5

awk -v threshold="$THRESHOLD" '
BEGIN {
    count = 0
}
/Failed password for/ {
    count++
}
END {
    if (count >= threshold) {
        print "[!] 警告:检测到 " count " 次 SSH 登录失败!可能有攻击行为。"
    }
}' "$LOG_FILE"

📌 输出示例:

[!] 警告:检测到 6 次 SSH 登录失败!可能有攻击行为。

✅ 应用价值:

  • 安全审计:及时发现暴力破解尝试
  • 可配合 cron 每分钟运行一次,实现基础入侵检测

三、实战案例:检测 OOM 杀死进程(Out Of Memory)

🧪 场景:从 dmesg 日志中检测是否发生 OOM 并报警

dmesg | awk '/oom_kill_process/ {
    print "[!] 警告:系统发生 OOM(内存不足),已杀死进程:" $0
}'

📌 示例输出:

[!] 警告:系统发生 OOM(内存不足),已杀死进程:oom_kill_process: Killed process 1234 (python)

✅ 应用价值:

  • 监控低内存服务器(如 ECS 2核2G Ubuntu)
  • 及时发现资源瓶颈或程序泄漏
  • 可结合邮件通知管理员排查问题

四、实战案例:监控 CPU 和内存使用率(配合 top/free)

🧪 场景:实时获取 CPU 和内存使用率并判断是否超过阈值

top -b -n 1 | awk '/Cpu\(s\):/ {
    split($0, cpu_usage, ",");
    user = substr(cpu_usage[1], index(cpu_usage[1], ":") + 2);
    system = substr(cpu_usage[3], index(cpu_usage[3], " ") + 1);
    total_cpu = user + system;
}

$1 == "Mem:" {
    used = $3;
    total = $2;
    percent_used = (used / total) * 100;
}

END {
    print "CPU 使用率:" total_cpu "%";
    print "内存使用率:" percent_used "%.2f%";
    
    if (total_cpu > 80 || percent_used > 90) {
        print "[!] 警告:系统资源使用过高,请检查!";
    }
}'

📌 输出示例:

CPU 使用率:85%
内存使用率:92.34%
[!] 警告:系统资源使用过高,请检查!

✅ 应用价值:

  • 预防服务崩溃
  • 快速定位性能瓶颈
  • 可用于小型 VPS、测试环境等资源受限场景

五、实战案例:监控磁盘使用率(df 输出解析)

🧪 场景:当根分区使用率超过 90% 时发出警告

df -h | awk '$NF == "/" {
    gsub(/%/, "", $5);
    if ($5 > 90) {
        print "[!] 警告:根分区使用率已达 " $5 "%,请清理磁盘!"
    }
}'

📌 输出示例:

[!] 警告:根分区使用率已达 95%,请清理磁盘!

✅ 应用价值:

  • 防止因磁盘满导致的服务不可用
  • 可用于定时任务自动提醒

六、实战案例:将报警信息写入日志或发送邮件

🧪 场景:将检测结果写入日志文件并发送邮件

#!/bin/bash
# monitor_and_alert.sh

RESULT=$(awk 'BEGIN {print "[INFO] 当前时间:" systime();} 
/Failed password/ {count++} 
END {if (count > 5) print "[!] 检测到 " count " 次登录失败"}' /var/log/auth.log)

if [[ "$RESULT" == *"[!]"* ]]; then
    echo "$RESULT" >> /var/log/monitor_alert.log
    echo "$RESULT" | mail -s "[紧急] 系统安全警告" admin@example.com
fi

📌 输出到日志文件 /var/log/monitor_alert.log 示例:

[INFO] 当前时间:1719069201
[!] 检测到 6 次登录失败

✅ 注意事项:

  • 确保系统已安装 mailutilssendmail
  • 可通过 sudo apt install mailutils 安装邮件客户端

七、不同 Linux 发行版注意事项(Ubuntu vs CentOS vs EulerOS)

功能 Ubuntu CentOS EulerOS
默认 awk gawk gawk gawk
支持 PROCINFO["sorted_in"] ✅(gawk >= 4.0)
认证日志路径 /var/log/auth.log /var/log/secure 同 CentOS
查看日志权限 sudo 查看 需 sudo 需 sudo
安装邮件工具 apt install mailutils yum install mailx yum install mailx

📌 小贴士:

  • 在 CentOS/EulerOS 上查看 /var/log/secure 需要管理员权限,建议使用 sudo awk ...
  • 不同系统的日志格式会影响字段提取逻辑,请先观察几行日志结构再写脚本

八、调试与优化建议

技巧 说明
print $0 打印原始行内容,确认是否符合预期
print NF 查看字段数量是否正确
print substr($0, 1, 50) 查看前几个字符,辅助定位字段偏移
`head -n 5 file awk '...'`
BEGIN{FS=","} 设置合适的字段分隔符提升可读性
next 提前跳过无用行,提升执行效率
delete array 清空数组释放内存,适用于大文件处理

✅ 总结

掌握 AWK 的系统监控与报警能力,是构建轻量级自动化运维体系的关键技能。通过以下方式,你可以在 Ubuntu、CentOS、EulerOS 等不同 Linux 系统上实现基础但有效的监控功能:

  • 解析日志识别异常登录、OOM、高负载等事件
  • 结合 topfreedf 等命令提取系统状态
  • 编写脚本自动判断并触发报警(终端提示、写入日志、发邮件)
  • 理解不同系统的日志格式和路径差异,写出兼容性强的脚本

继续练习真实日志和系统命令输出,你会越来越熟练地运用这些监控技巧,成为一名真正的 Linux 系统守护者!🛡️🖥️🔥

posted @ 2025-06-22 23:22  红尘过客2022  阅读(62)  评论(0)    收藏  举报