AWK 系统监控与报警
《AWK 系统监控与报警》
🎯 学习目标
- 掌握使用 AWK 对系统日志、资源使用情况(CPU、内存、磁盘)进行实时分析
- 能够编写脚本识别异常行为(如登录失败、OOM 杀死进程、高负载)
- 实现基于文本的简易“报警”机制(输出到终端、发送邮件、写入文件)
- 理解如何在不同 Linux 发行版(Ubuntu、CentOS、EulerOS)中适配日志格式和路径差异
- 提升自动化运维能力,为构建轻量级监控工具打下基础
🔑 核心重点
| 类别 | 内容 |
|---|---|
| 监控对象 | CPU 使用率、内存占用、磁盘空间、登录尝试、OOM 杀死进程 |
| 数据来源 | /proc 文件系统、top、free、df、日志文件(如 /var/log/syslog, dmesg) |
| 常用函数 | match(), substr(), index(), system() |
| 报警方式 | 终端输出、写入日志文件、调用 mail 或 sendmail 发送邮件 |
| 注意事项 | 不同发行版日志路径差异;权限问题影响读取;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 次登录失败
✅ 注意事项:
- 确保系统已安装
mailutils或sendmail - 可通过
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、高负载等事件
- 结合
top、free、df等命令提取系统状态 - 编写脚本自动判断并触发报警(终端提示、写入日志、发邮件)
- 理解不同系统的日志格式和路径差异,写出兼容性强的脚本
继续练习真实日志和系统命令输出,你会越来越熟练地运用这些监控技巧,成为一名真正的 Linux 系统守护者!🛡️🖥️🔥

浙公网安备 33010602011771号