服务器流量监控脚本,每日流量报表推送:服务器流量监控脚本
服务器每天跑了多少流量,如果不主动记录,月底被扣费或带宽跑满时才发现就晚了。
本文用一个轻量脚本把这件事自动化:在 Linux 服务器上安装流量统计工具,编写 Shell 脚本生成每日流量报表,再通过 crontab 定时推送到邮箱或钉钉,零基础也能跟着做完。
准备工作:安装流量统计工具
系统自带的 ifconfig 或 ip 命令只能看累计值,不方便按天统计。
推荐用 vnstat,它会持续记录网卡流量,并提供按天、按月查询的能力。
以 Debian/Ubuntu 为例:
sudo apt update
sudo apt install vnstat -y
CentOS/Rocky Linux 使用:
sudo yum install epel-release -y
sudo yum install vnstat -y
安装后启动并设置开机自启:
sudo systemctl enable --now vnstat
确认服务状态和网卡识别情况:
vnstat --version
vnstat -i eth0
把 eth0 换成你实际的网卡名,可以用 ip addr 查看。
如果输出中能看到当天的收发数据,说明统计已经生效。
编写每日流量报表脚本
脚本要做三件事:取昨天的流量数据、拼成可读文本、调用推送通道发出去。
下面以推送到钉钉机器人为例,邮箱方式在末尾说明。
创建脚本文件:
sudo vim /opt/traffic_report.sh
写入以下内容:
#!/bin/bash
# 服务器每日流量报表推送
IFACE="eth0"
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"
# 获取昨日流量(vnstat 输出格式:日期 接收 发送 合计)
DATA=$(vnstat -i "$IFACE" --json | \
jq -r '.interfaces[0].traffic.day[-2] | "\(.date.year)-\(.date.month)-\(.date.day) 接收:\(.rx/1024/1024|floor)MB 发送:\(.tx/1024/1024|floor)MB"')
# 拼装消息
MSG="服务器流量日报\n网卡: $IFACE\n$DATA"
# 推送到钉钉
curl -s -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}" \
"$WEBHOOK"
保存后赋予执行权限:
sudo chmod +x /opt/traffic_report.sh
这里用到了 jq 解析 JSON,如果系统没有,先安装:
sudo apt install jq -y # Debian/Ubuntu
sudo yum install jq -y # CentOS/Rocky
先手动跑一次,确认能收到消息:
sudo /opt/traffic_report.sh
如果钉钉群里出现流量数据,说明脚本本身没问题。
配置定时任务自动推送
脚本手动能跑通后,用 crontab 让它每天早上自动执行。
sudo crontab -e
添加一行,表示每天早上 8 点执行:
0 8 * * * /opt/traffic_report.sh >/dev/null 2>&1
保存退出后,确认任务已写入:
sudo crontab -l
几个容易踩坑的地方:
- crontab 环境变量和登录 shell 不同,脚本里尽量用绝对路径,比如
/usr/bin/curl,避免找不到命令。 - 网卡名写错会导致取不到数据,先用
ip addr确认。 - 钉钉机器人有安全设置,如果选了“加签”,需要在脚本里额外计算签名;选“自定义关键词”则消息里必须包含该关键词。
- vnstat 刚安装时当天数据可能不全,建议第二天再观察报表是否正常。
改成邮件推送或添加多网卡
如果不想用钉钉,可以改用 mail 命令。
先确保系统能发邮件,然后把脚本中的 curl 部分替换为:
echo -e "$MSG" | mail -s "服务器流量日报" your@email.com
服务器有多张网卡时,把 IFACE 改成数组循环处理:
for IFACE in eth0 eth1; do
# 复用上面的取值逻辑
done
这样每张网卡的流量都会单独列在报表里。
验证与日常检查
推送配置完成后,按下面几点确认效果:
- 手动执行脚本,检查钉钉或邮箱是否收到消息;
- 等待一个定时周期,确认 crontab 按时触发;
- 用
vnstat -d对比脚本里的数值,确保统计口径一致; - 如果某天没收到报表,先看
/var/log/syslog或journalctl -u cron里的执行记录。
只要 vnstat 在跑、脚本能手动执行、crontab 时间正确,每日流量报表推送就能稳定工作。
后续可以按需增加月流量汇总、超阈值告警等逻辑。
常见疑问
脚本报错 jq: command not found 怎么办?
说明系统没装 jq,按前面命令安装即可,或者改用 awk 解析 vnstat 的文本输出。
钉钉收不到消息,curl 也没报错?
检查机器人安全设置是否要求加签或关键词,并确认 webhook 地址完整复制。
vnstat 显示的数据和实际流量对不上?
vnstat 统计的是网卡层面的流量,不含被防火墙丢弃的包,和运营商账单口径可能有差异,属于正常现象。