bash脚本,流量监控 Plus
TIME 2023-06-19 20:28
创建名为“流量监控”的 bash 脚本
vi 流量监控.sh
粘贴以下内容
#!/bin/bash
# 初始化累计出站和入站数据为0
total_out_bytes=0
total_in_bytes=0
monthly_out_bytes=0
monthly_in_bytes=0
# 获取初始日期
previous_month=$(date "+%m")
while true; do
    # 获取当前时间、出网流量和入网流量
    date=$(date "+%Y-%m-%d")
    month=$(date "+%m")
    day_of_week=$(date "+%u")
    case $day_of_week in
        "1") day_of_week="周一" ;;
        "2") day_of_week="周二" ;;
        "3") day_of_week="周三" ;;
        "4") day_of_week="周四" ;;
        "5") day_of_week="周五" ;;
        "6") day_of_week="周六" ;;
        "7") day_of_week="周日" ;;
    esac
    system_time=$(date "+%H:%M:%S")
    # 获取CPU和内存使用情况
    cpu_usage=$(ps aux | awk 'BEGIN {sum=0} {sum+=$3}; END {printf("%.0f", sum)}')
    memory_usage=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
    out_bytes=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    in_bytes=$(cat /sys/class/net/eth0/statistics/rx_bytes)
    # 等待1秒钟,并获取新的出网流量和入网流量
    sleep 1
    out_bytes_new=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    in_bytes_new=$(cat /sys/class/net/eth0/statistics/rx_bytes)
    # 计算出网速度,单位为M
    out_speed=$(echo "scale=3; ($out_bytes_new - $out_bytes) / 1000000" | bc)
    if (( $(echo "$out_speed < 1" | bc -l) )); then
        out_speed=$(printf '%.3f' $out_speed)
    fi
    # 计算入网速度,单位为M
    in_speed=$(echo "scale=3; ($in_bytes_new - $in_bytes) / 1000000" | bc)
    if (( $(echo "$in_speed < 1" | bc -l) )); then
        in_speed=$(printf '%.3f' $in_speed)
    fi
    # 累加出站和入站数据
    total_out_bytes=$(echo "$total_out_bytes + $out_bytes_new - $out_bytes" | bc)
    total_in_bytes=$(echo "$total_in_bytes + $in_bytes_new - $in_bytes" | bc)
    total_out_MB=$(echo "scale=3; $total_out_bytes / 1000000" | bc)
    total_in_MB=$(echo "scale=3; $total_in_bytes / 1000000" | bc)
    if (( $(echo "$total_out_MB < 1" | bc -l) )); then
        total_out_MB=$(printf '%.3f' $total_out_MB)
    fi
    if (( $(echo "$total_in_MB < 1" | bc -l) )); then
        total_in_MB=$(printf '%.3f' $total_in_MB)
    fi    # 如果月份变更,则重置月度流量
    if [ "$month" != "$previous_month" ]; then
        monthly_out_bytes=0
        monthly_in_bytes=0
        previous_month=$month
    fi
    # 累加月度出站和入站数据
    monthly_out_bytes=$(echo "$monthly_out_bytes + $out_bytes_new - $out_bytes" | bc)
    monthly_in_bytes=$(echo "$monthly_in_bytes + $in_bytes_new - $in_bytes" | bc)
    monthly_out_MB=$(echo "scale=3; $monthly_out_bytes / 1000000" | bc)
    monthly_in_MB=$(echo "scale=3; $monthly_in_bytes / 1000000" | bc)
    if (( $(echo "$monthly_out_MB < 1" | bc -l) )); then
        monthly_out_MB=$(printf '%.3f' $monthly_out_MB)
    fi
    if (( $(echo "$monthly_in_MB < 1" | bc -l) )); then
        monthly_in_MB=$(printf '%.3f' $monthly_in_MB)
    fi
    # 输出结果
    echo "$date $day_of_week $system_time CPU$cpu_usage% 内存$memory_usage% 出站${out_speed}M/s 进站${in_speed}M/s 今日出站${total_out_MB}M 进站${total_in_MB}M 本月出站${monthly_out_MB}M 进站${monthly_in_MB}M"
    # 保存到日志文件
    echo "$date $day_of_week $system_time CPU$cpu_usage% 内存$memory_usage% 出站${out_speed}M/s 进站${in_speed}M/s 今日出站${total_out_MB}M 进站${total_in_MB}M 本月出站${monthly_out_MB}M 进站${monthly_in_MB}M" >> ./net_usage.log
done
上面这个脚本依赖于 bc 二进制计算器
安装命令
安装命令
apt install -y bc
赋予流量监控脚本“流量监控.sh”可执行权限
chmod +x 流量监控.sh
用 Screen 创建一个名为“流量监控”离线任务
screen -S 流量监控
运行流量监控脚本“流量监控.sh”
./流量监控.sh
返回输出以下结果,每秒钟刷新一次
2023-06-19 周一 20:45:05 CPU1% 内存19% 出站0.002M/s 进站0.001M/s 今日出站0.258M 进站0.157M 本月出站0.258M 进站0.157M 2023-06-19 周一 20:45:06 CPU6% 内存19% 出站0.002M/s 进站0.001M/s 今日出站0.261M 进站0.158M 本月出站0.261M 进站0.158M 2023-06-19 周一 20:45:07 CPU102% 内存19% 出站0.001M/s 进站0.001M/s 今日出站0.262M 进站0.159M 本月出站0.262M 进站0.159M 2023-06-19 周一 20:45:08 CPU23% 内存19% 出站0.002M/s 进站0.001M/s 今日出站0.264M 进站0.160M 本月出站0.264M 进站0.160M
这个脚本有个小bug,那就是CPU项不能数值对其,三位数对齐
#!/bin/bash
# 初始化累计出站和入站数据为0
total_out_bytes=0
total_in_bytes=0
monthly_out_bytes=0
monthly_in_bytes=0
# 获取初始日期
previous_month=$(date "+%m")
while true; do
    # 获取当前时间、出网流量和入网流量
    date=$(date "+%Y-%m-%d")
    month=$(date "+%m")
    day_of_week=$(date "+%u")
    case $day_of_week in
        "1") day_of_week="周一" ;;
        "2") day_of_week="周二" ;;
        "3") day_of_week="周三" ;;
        "4") day_of_week="周四" ;;
        "5") day_of_week="周五" ;;
        "6") day_of_week="周六" ;;
        "7") day_of_week="周日" ;;
    esac
    system_time=$(date "+%H:%M:%S")
    # 获取CPU和内存使用情况
    cpu_usage=$(ps aux | awk 'BEGIN {sum=0} {sum+=$3}; END {printf("%03d", sum)}')
    memory_usage=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
    out_bytes=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    in_bytes=$(cat /sys/class/net/eth0/statistics/rx_bytes)
    # 等待1秒钟,并获取新的出网流量和入网流量
    sleep 1
    out_bytes_new=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    in_bytes_new=$(cat /sys/class/net/eth0/statistics/rx_bytes)
    
    # 计算出网速度,单位为M
    out_speed=$(echo "scale=3; ($out_bytes_new - $out_bytes) / 1000000" | bc)
    if (( $(echo "$out_speed < 1" | bc -l) )); then
        out_speed=$(printf '%.3f' $out_speed)
    fi
    # 计算入网速度,单位为M
    in_speed=$(echo "scale=3; ($in_bytes_new - $in_bytes) / 1000000" | bc)
    if (( $(echo "$in_speed < 1" | bc -l) )); then
        in_speed=$(printf '%.3f' $in_speed)
    fi
    # 累加出站和入站数据
    total_out_bytes=$(echo "$total_out_bytes + $out_bytes_new - $out_bytes" | bc)
    total_in_bytes=$(echo "$total_in_bytes + $in_bytes_new - $in_bytes" | bc)
    total_out_MB=$(echo "scale=3; $total_out_bytes / 1000000" | bc)
    total_in_MB=$(echo "scale=3; $total_in_bytes / 1000000" | bc)
    if (( $(echo "$total_out_MB < 1" | bc -l) )); then
        total_out_MB=$(printf '%.3f' $total_out_MB)
    fi
    if (( $(echo "$total_in_MB < 1" | bc -l) )); then
        total_in_MB=$(printf '%.3f' $total_in_MB)
    fi
    # 如果月份变更,则重置月度流量
    if [ "$month" != "$previous_month" ]; then
        monthly_out_bytes=0
        monthly_in_bytes=0
        previous_month=$month
    fi
    # 累加月度出站和入站数据
    monthly_out_bytes=$(echo "$monthly_out_bytes + $out_bytes_new - $out_bytes" | bc)
    monthly_in_bytes=$(echo "$monthly_in_bytes + $in_bytes_new - $in_bytes" | bc)
    monthly_out_MB=$(echo "scale=3; $monthly_out_bytes / 1000000" | bc)
    monthly_in_MB=$(echo "scale=3; $monthly_in_bytes / 1000000" | bc)
    if (( $(echo "$monthly_out_MB < 1" | bc -l) )); then
        monthly_out_MB=$(printf '%.3f' $monthly_out_MB)
    fi
    if (( $(echo "$monthly_in_MB < 1" | bc -l) )); then
        monthly_in_MB=$(printf '%.3f' $monthly_in_MB)
    fi
    # 输出结果
    echo "$date $day_of_week $system_time CPU${cpu_usage}% 内存$memory_usage% 出站${out_speed}M/s 进站${in_speed}M/s 今日出站${total_out_MB}M 进站${total_in_MB}M 本月出站${monthly_out_MB}M 进站${monthly_in_MB}M"
    # 保存到日志文件
    echo "$date $day_of_week $system_time CPU${cpu_usage}% 内存$memory_usage% 出站${out_speed}M/s 进站${in_speed}M/s 今日出站${total_out_MB}M 进站${total_in_MB}M 本月出站${monthly_out_MB}M 进站${monthly_in_MB}M" >> ./net_usage.log
done
运行效果
2023-06-19 周一 21:56:55 CPU000% 内存44% 出站0.001M/s 进站0.001M/s 今日出站0.119M 进站0.074M 本月出站0.119M 进站0.074M 2023-06-19 周一 21:56:56 CPU000% 内存44% 出站0.002M/s 进站0.001M/s 今日出站0.121M 进站0.076M 本月出站0.121M 进站0.076M 2023-06-19 周一 21:56:57 CPU000% 内存44% 出站0.002M/s 进站0.001M/s 今日出站0.123M 进站0.077M 本月出站0.123M 进站0.077M
后面再把磁盘IO给添加上去
点击数:16
 在太阳下
在太阳下