从零到一:如何编写一个高效的服务器流量监控脚本(附完整代码与避坑指南)
目录导读
- 为什么你需要一个自定义流量监控脚本?(场景与痛点)
- 核心设计思路:监控脚本的三大支柱(采集、存储、告警)
- 实战代码拆解:基于Bash + Python的混合方案
- 进阶技巧:如何处理高并发与历史数据趋势分析
- 常见坑点与性能优化(含iptables误用、时区问题等)
- 专家问答:关于流量监控脚本的5个高频疑问
为什么你需要一个自定义流量监控脚本?
市面上的监控工具(如Zabbix、Prometheus)虽强大,但对于轻量级服务器或特定业务场景(如临时端口监控、按IP段统计流量)往往显得笨重。自己写脚本的优势在于:

- 精准控制:只采集你关心的数据(如特定进程的流量)。
- 零依赖:无需安装重量级Agent,适合容器或边缘设备。
- 成本透明:可精确计算每次请求产生的流量费用(如云厂商按流量计费)。
核心设计思路:监控脚本的三大支柱
一个合格的流量监控脚本必须解决三个问题:
- 采集:从哪读数据?Linux下首选
/proc/net/dev(实时字节数)或tcpdump(抓包分析)。 - 存储:数据存哪里?轻量用
RRDtool或直接追加到SQLite/CSV。 - 告警:何时通知?通过阈值触发邮件、钉钉或Webhook。
实战代码拆解:基于Bash + Python的混合方案
以下脚本结合Bash的轻量采集与Python的计算/告警,实现每10秒统计一次指定网卡(如eth0)的实时速率:
#!/bin/bash
# 采集部分:读取/proc/net/dev,输出到临时文件
INTERFACE="eth0"
while true; do
RX1=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $2}')
TX1=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $10}')
sleep 10
RX2=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $2}')
TX2=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $10}')
echo "$(date +%s) $(( (RX2-RX1)*8/10 )) $(( (TX2-TX1)*8/10 ))" >> /tmp/net_flow.log
# 调用Python分析(阈值告警)
python3 /opt/check_alert.py
done
Python分析模块(check_alert.py)核心逻辑:
import time
threshold = 100 * 1024 * 1024 # 100Mbps
with open('/tmp/net_flow.log') as f:
line = f.readlines()[-1].split()
rx_rate = int(line[1]) # 单位:bps
if rx_rate > threshold:
print(f"ALERT: Inbound rate {rx_rate/1024/1024:.2f} Mbps exceeded!")
# 此处可调用requests.post()发送Webhook
关键点: 脚本使用 /proc/net/dev 获取的是累计字节数,必须通过两次采样差值计算速率,单位换算(bit vs byte)和休眠时间(10秒)决定了数据的精度。
进阶技巧:如何处理高并发与历史数据趋势分析
- 并发瓶颈:若监控多个网卡或服务器,建议用多线程(Python
threading)或直接改用psutil库(psutil.net_io_counters(pernic=True))简化采集。 - 趋势分析:利用
pandas读取CSV,通过滑动平均(rolling(window=30).mean())过滤瞬时尖峰,再画图(matplotlib)或导出给Grafana。
常见坑点与性能优化
| 坑点 | 解决方案 |
|---|---|
| CPU占用高 | 避免频繁调用tcpdump,改为读取内核计数文件。 |
| 时区错乱 | 时间戳用 time.time()(UTC),展示时再转换。 |
| 重启后数据丢失 | 使用 systemd 服务或 supervisor 守护脚本。 |
| IPv6流量统计缺失 | 检查 /proc/net/dev 中 eth0 是否包含IPv6计数(通常包含)。 |
专家问答:关于流量监控脚本的5个高频疑问
问1:为什么我用 ifconfig 看到的流量和 /proc/net/dev 不一致?
答:ifconfig 显示的是历史累计值,而监控脚本计算的是增量,若你修改了网卡MAC或重启网络服务,计数器会清零。
问2:监控脚本需要root权限吗?
答:读取 /proc/net/dev 不需要root,但若用 tcpdump 抓包必须root,建议以普通用户运行,通过 setcap 赋予抓包能力。
问3:如何限制脚本只监控某个进程(如Nginx)的流量?
答:使用 nethogs 工具,或通过 iptables -A OUTPUT -m owner --uid-owner nginx 配合计数获取。
问4:脚本写入文件会不会耗尽磁盘?
答:务必添加日志轮转(logrotate),或改用 round-robin 数据库(如RRDtool)。
问5:是否有现成库比纯Bash更快?
答:对于复杂逻辑,用 Python + psutil 更高效,代码量减少50%且跨平台。
监控脚本的核心不在于代码多复杂,而在于采样精度与告警时效性的平衡,建议先从最小可用版本(MVD)开始,逐步加入历史回溯与自动发现功能,希望本文提供的思路能帮助你构建出适配业务场景的流量监控利器——毕竟,没有监控的生产环境,就像蒙眼开车,而一个10行脚本,往往比装一套沉重的监控平台更实用。