服务器流量统计脚本,每日生成流量报表:服务器流量统计脚本
服务器流量超标可能导致额外费用或服务中断,尤其使用按流量计费的云服务器时,每日掌握进出流量非常必要。
本文面向零基础用户,通过 vnStat 这款轻量工具,手把手教你搭建一个每天自动生成流量报表的脚本。
完成后,你每天都能在指定目录看到前一天的流量统计,无需手动查询。
安装 vnStat 与初始化数据库
vnStat 是 Linux 下常用的流量统计工具,它从网卡读取数据,不抓包,对系统性能影响极小。
Debian/Ubuntu 系统:
sudo apt update
sudo apt install vnstat -y
CentOS/RHEL 系统:
sudo yum install epel-release -y
sudo yum install vnstat -y
安装后启动服务并设置开机自启:
sudo systemctl start vnstat
sudo systemctl enable vnstat
确认 vnStat 已识别你的网卡(通常为 eth0 或 ens33):
vnstat --iflist
如果输出中列出多个网卡,记下你实际使用的网卡名,后续脚本需要指定。
编写每日流量报表脚本
创建一个脚本文件,例如 /usr/local/bin/daily_traffic_report.sh,内容如下:
#!/bin/bash
# 指定网卡名称,根据实际情况修改
INTERFACE="eth0"
# 报表保存目录
REPORT_DIR="/var/log/traffic_reports"
mkdir -p "$REPORT_DIR"
# 获取昨天的日期,格式如 2025-01-30
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 生成流量摘要并写入文件
{
echo "=== 服务器流量日报 $YESTERDAY ==="
echo ""
echo "网卡: $INTERFACE"
echo ""
vnstat -i "$INTERFACE" -d | grep "$YESTERDAY"
echo ""
echo "--- 月度累计 ---"
vnstat -i "$INTERFACE" -m
echo ""
echo "--- 实时速率 ---"
vnstat -i "$INTERFACE" -tr
} > "$REPORT_DIR/traffic_$YESTERDAY.txt"
echo "报表已生成: $REPORT_DIR/traffic_$YESTERDAY.txt"
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/daily_traffic_report.sh
先手动运行一次,确认能正常输出:
sudo /usr/local/bin/daily_traffic_report.sh
检查 /var/log/traffic_reports/ 目录下是否生成了文件,并查看内容是否包含昨日流量数据。
设置定时任务每天自动执行
使用 cron 让脚本每天凌晨执行。
编辑当前用户的定时任务:
crontab -e
添加下面一行,表示每天 00:05 执行脚本:
5 0 * * * /usr/local/bin/daily_traffic_report.sh > /dev/null 2>&1
保存退出。
如果使用 sudo 编辑 root 的 crontab,确保脚本路径和权限正确。
验证定时任务是否生效: 可以先将时间改为 2 分钟后,观察是否生成新文件。
测试完成后记得改回凌晨时间。
避坑指南:常见问题与解决
1. 报表中无数据
可能是网卡名错误或 vnStat 未启动。
运行 vnstat --iflist 确认网卡,用 systemctl status vnstat 检查服务状态。
2. 权限不足导致脚本无法写入
报表目录建议放在 /var/log 下,并确保执行用户有写权限。
如果使用 root 的 crontab,脚本会自动以 root 运行,一般无权限问题。
3. 日期格式不匹配
vnstat -d 输出的日期格式可能是 2025-01-30 或 01/30/2025,根据系统区域设置不同。
若 grep 不到,可先手动运行 vnstat -d 查看格式,再调整脚本中的日期变量。
4. 脚本手动运行正常,cron 不执行
检查 cron 服务是否运行:systemctl status crond(CentOS)或 systemctl status cron(Ubuntu)。
另外,cron 环境变量与终端不同,建议在脚本中使用绝对路径,或在 crontab 中指定 PATH。
如何查看和利用流量报表
报表文件默认保存在 /var/log/traffic_reports/,文件名包含日期。
你可以直接用 cat 查看:
cat /var/log/traffic_reports/traffic_2025-01-30.txt
如果希望长期保留,可以定期清理旧文件,例如只保留最近 30 天:
find /var/log/traffic_reports/ -name "traffic_*.txt" -mtime +30 -delete
将这条命令加入 crontab,即可自动清理。
对于需要集中管理的场景,可以结合 scp 或 rsync 将报表同步到远程服务器或对象存储。
验证报表是否准确
在服务器上执行 vnstat -i eth0 -d 手动查看昨日流量,与脚本生成的报表对比,数值应一致。
如果发现差异,检查脚本是否在流量统计更新后执行——vnStat 默认每 5 分钟更新一次数据库,凌晨执行时昨日数据通常已完整。
常见疑问:
问:脚本可以统计多个网卡吗? 可以,修改脚本中的 INTERFACE 变量为多个网卡循环,或分别生成报表。
问:vnStat 会占用大量磁盘空间吗? 不会,数据库文件通常只有几 MB,保留数月数据无压力。
问:流量单位是 GB 还是 MB? vnStat 自动适配,输出中会标明单位,无需手动换算。