从SNMPwalk到自动化监控5个实战脚本解锁Linux性能监控新姿势运维工程师的日常总是伴随着各种监控工具从老牌的Nagios到功能强大的Zabbix再到新兴的Prometheus选择虽多但配置复杂度也水涨船高。当我们需要快速获取服务器关键指标时SNMP这个古老的协议反而展现出独特的轻量优势。本文将带您超越基础命令用5个可立即投入生产的脚本构建属于您的轻量级监控系统。1. 环境准备与工具安装在开始自动化之旅前我们需要确保基础环境就位。不同于传统教程仅介绍安装命令这里会深入解析每个组件的实际作用。net-snmp-utils是SNMP工具集的核心包包含snmpwalk、snmpget等实用程序。根据您的Linux发行版安装方式略有差异# Ubuntu/Debian系 sudo apt update sudo apt install -y snmp libsnmp-dev # RHEL/CentOS系 sudo yum install -y net-snmp-utils net-snmp-libs安装完成后验证版本信息确保组件完整snmpwalk -v 2c -c public localhost system | head -5注意生产环境中务必修改默认的community string(public)这是基本的安全防护措施常见问题排查表现象可能原因解决方案连接超时SNMP服务未启动sudo systemctl start snmpd无数据返回防火墙阻挡开放UDP 161端口权限拒绝SELinux限制setsebool -P snmpd 12. 核心指标采集脚本监控系统的价值在于持续采集关键指标。以下脚本展示了如何自动化获取CPU、内存、磁盘等核心数据。2.1 CPU使用率监控#!/bin/bash # cpu_monitor.sh - 采集CPU负载指标 COMMUNITYyour_secure_community HOSTlocalhost # 获取1分钟平均负载 CPU_LOAD$(snmpwalk -v 2c -c $COMMUNITY $HOST .1.3.6.1.4.1.2021.10.1.3.1 | awk {print $4}) # 获取用户态CPU使用率 CPU_USER$(snmpwalk -v 2c -c $COMMUNITY $HOST .1.3.6.1.4.1.2021.11.9.0 | awk {print $4}) # 获取系统态CPU使用率 CPU_SYSTEM$(snmpwalk -v 2c -c $COMMUNITY $HOST .1.3.6.1.4.1.2021.11.10.0 | awk {print $4}) echo CPU监控报告 $(date) echo --------------------- echo 1分钟平均负载: $CPU_LOAD echo 用户态使用率: ${CPU_USER}% echo 系统态使用率: ${CPU_SYSTEM}%这个脚本揭示了SNMP监控的精髓 - 通过特定的OID(对象标识符)获取精确指标。关键OID说明.1.3.6.1.4.1.2021.10.1.3.11分钟平均负载.1.3.6.1.4.1.2021.11.9.0用户态CPU百分比.1.3.6.1.4.1.2021.11.10.0系统态CPU百分比2.2 内存使用分析内存监控需要关注三个核心指标总内存、已用内存和缓存使用情况。以下Python脚本提供了更灵活的数据处理#!/usr/bin/env python3 # memory_monitor.py - 高级内存分析 import subprocess import re def get_snmp_value(oid): cmd fsnmpwalk -v 2c -c your_secure_community localhost {oid} output subprocess.getoutput(cmd) return output.split()[-1] memory_stats { 总内存: 1.3.6.1.4.1.2021.4.5.0, 可用内存: 1.3.6.1.4.1.2021.4.6.0, 缓存内存: 1.3.6.1.4.1.2021.4.15.0 } print(内存状态报告) print(*40) for name, oid in memory_stats.items(): value int(get_snmp_value(oid)) // 1024 # 转换为MB print(f{name:10}: {value} MB) used_mem int(get_snmp_value(1.3.6.1.4.1.2021.4.6.0)) // 1024 total_mem int(get_snmp_value(1.3.6.1.4.1.2021.4.5.0)) // 1024 usage_percent (total_mem - used_mem) / total_mem * 100 print(f\n内存使用率: {usage_percent:.1f}%)3. 数据持久化与可视化采集的数据需要存储和分析才能发挥价值。这里介绍两种轻量级方案。3.1 CSV日志存储#!/bin/bash # log_to_csv.sh - 将监控数据记录到CSV文件 LOG_FILE/var/log/snmp_monitor_$(date %Y%m%d).csv # 如果文件不存在写入表头 [ ! -f $LOG_FILE ] echo Timestamp,CPU_Load,CPU_User,CPU_System,Mem_Total,Mem_Used $LOG_FILE # 采集数据 TIMESTAMP$(date %Y-%m-%d %H:%M:%S) CPU_LOAD$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.10.1.3.1 | awk {print $4}) CPU_USER$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.11.9.0 | awk {print $4}) CPU_SYSTEM$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.11.10.0 | awk {print $4}) MEM_TOTAL$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.4.5.0 | awk {print $4}) MEM_USED$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.4.6.0 | awk {print $4}) # 追加数据到CSV echo $TIMESTAMP,$CPU_LOAD,$CPU_USER,$CPU_SYSTEM,$MEM_TOTAL,$MEM_USED $LOG_FILE配合crontab设置定时任务# 每5分钟执行一次监控 */5 * * * * /path/to/log_to_csv.sh3.2 终端可视化展示对于喜欢命令行环境的工程师使用gnuplot可以快速生成直观的图表#!/bin/bash # plot_stats.sh - 生成终端图表 DATA_FILE/var/log/snmp_monitor_$(date %Y%m%d).csv OUTPUT_PNG/tmp/system_stats.png gnuplot EOF set terminal png size 1000,600 set output $OUTPUT_PNG set xdata time set timefmt %Y-%m-%d %H:%M:%S set format x %H:%M set xlabel 时间 set ylabel 使用率(%) set title 系统资源监控 $(date %Y-%m-%d) plot $DATA_FILE using 1:3 with lines title CPU用户态, \ $DATA_FILE using 1:4 with lines title CPU系统态, \ $DATA_FILE using 1:(\$6/\$5*100) with lines title 内存使用率 EOF display $OUTPUT_PNG4. 告警机制实现监控系统的核心价值在于及时发现问题。以下脚本实现了阈值告警功能。4.1 基础阈值检测#!/bin/bash # check_thresholds.sh - 资源阈值检查 # 定义阈值 CPU_WARNING80 CPU_CRITICAL90 MEM_WARNING85 MEM_CRITICAL95 # 获取当前值 CPU_USAGE$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.11.9.0 | awk {print $4}) CPU_USAGE$((CPU_USAGE $(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.11.10.0 | awk {print $4}))) MEM_TOTAL$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.4.5.0 | awk {print $4}) MEM_USED$(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.4.6.0 | awk {print $4}) MEM_PERCENT$(( (MEM_TOTAL - MEM_USED) * 100 / MEM_TOTAL )) # CPU检查 if [ $CPU_USAGE -ge $CPU_CRITICAL ]; then echo CRITICAL: CPU使用率 ${CPU_USAGE}% | 发送邮件告警... # 这里添加邮件发送命令 elif [ $CPU_USAGE -ge $CPU_WARNING ]; then echo WARNING: CPU使用率 ${CPU_USAGE}% fi # 内存检查 if [ $MEM_PERCENT -ge $MEM_CRITICAL ]; then echo CRITICAL: 内存使用率 ${MEM_PERCENT}% | 发送短信告警... # 这里添加短信发送命令 elif [ $MEM_PERCENT -ge $MEM_WARNING ]; then echo WARNING: 内存使用率 ${MEM_PERCENT}% fi4.2 集成Telegram告警对于分布式团队即时通讯工具集成更为高效#!/usr/bin/env python3 # telegram_alert.py - Telegram机器人告警 import requests import subprocess def send_telegram_alert(message): bot_token YOUR_BOT_TOKEN chat_id YOUR_CHAT_ID url fhttps://api.telegram.org/bot{bot_token}/sendMessage payload { chat_id: chat_id, text: message, parse_mode: Markdown } requests.post(url, jsonpayload) # 获取CPU负载 cpu_load subprocess.getoutput(snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.10.1.3.1 | awk {print $4}) if float(cpu_load) 5.0: # 假设5.0是告警阈值 send_telegram_alert(f *服务器告警*\n主机: {subprocess.getoutput(hostname)}\nCPU负载: {cpu_load})5. 高级技巧与优化5.1 SNMPv3安全配置生产环境推荐使用SNMPv3替代v2c提供加密和认证# 创建SNMPv3用户 sudo net-snmp-create-v3-user -ro -A secure_auth_pass -X secure_priv_pass -a SHA -x AES monitoring_user # 测试查询 snmpwalk -v3 -u monitoring_user -l authPriv -a SHA -A secure_auth_pass -x AES -X secure_priv_pass localhost system5.2 自定义OID扩展通过扩展SNMP的MIB定义可以监控更多应用特定指标编辑/etc/snmp/snmpd.conf添加# 监控Nginx活跃连接数 pass .1.3.6.1.4.1.2021.50 /usr/bin/curl -s http://localhost/nginx_status | awk /Active connections/{print $3}重启服务后即可查询snmpwalk -v 2c -c your_secure_community localhost .1.3.6.1.4.1.2021.505.3 性能优化建议当监控大量主机时原始SNMPwalk可能效率低下。考虑以下优化批量查询使用snmpbulkwalk替代snmpwalk并行采集使用GNU parallel工具缓存结果对不常变化的指标实施本地缓存示例并行采集脚本#!/bin/bash # parallel_monitor.sh - 并行采集多主机指标 HOSTS(server1 server2 server3) OIDS(.1.3.6.1.4.1.2021.10.1.3.1 .1.3.6.1.4.1.2021.4.5.0) parallel -j 4 snmpwalk -v 2c -c your_secure_community {} ::: ${HOSTS[]} ::: ${OIDS[]}