全球主机交流论坛
标题:
阿里云alpine系统,检测流量达标则关机脚本
[打印本页]
作者:
调查员
时间:
2024-9-18 19:16
标题:
阿里云alpine系统,检测流量达标则关机脚本
本帖最后由 调查员 于 2024-9-18 19:18 编辑
此脚本是之前坛友发的,
我稍加修改,
使流量检测更准。
(之前的非常不准,我这个脚本,经过我多天检测,跟阿里云后台的流量变动几乎一致)
添加了五分钟后关机的命令。(怕开机后死循环)
建议定时任务,设为10分钟运行一次。
*/10 * * * * ash /root/aliyun_traffic.sh >/dev/null
(alpine系统,是用ash代替bash)
#!/bin/bash
# 获取当前脚本的绝对路径
SCRIPT_PATH=$(realpath "$0")
# 保存流量数据的目录和文件
TRAFFIC_DIR="/root/network_traffic"
TRAFFIC_FILE="$TRAFFIC_DIR/network_traffic.dat"
LOG_FILE="$TRAFFIC_DIR/network_traffic_monitor.log"
CURRENT_MONTH=$(date +"%Y-%m")
SHUTDOWN_THRESHOLD=$((19 * 1024 * 1024 * 1024)) # 19GB 转换为字节的整数表示
# 要监控的网络接口
INTERFACE="eth0"
# 创建保存流量数据的目录
if [ ! -d "$TRAFFIC_DIR" ]; then
mkdir -p "$TRAFFIC_DIR"
if [ $? -eq 0 ]; then
echo "目录 $TRAFFIC_DIR 创建成功"
else
echo "无法创建目录 $TRAFFIC_DIR"
exit 1
fi
fi
# 定义日志记录函数
log_message() {
local message="$1"
echo "$(date +"%Y-%m-%d %H:%M:%S") - $message" >> $LOG_FILE
}
# 初始化日志文件
if [ ! -f $LOG_FILE ]; then
touch $LOG_FILE
log_message "日志文件创建成功"
fi
# 如果流量文件不存在或者月份不同,则创建并初始化
if [ ! -f $TRAFFIC_FILE ]; then
echo "$CURRENT_MONTH 0 0" > $TRAFFIC_FILE
log_message "流量文件创建成功"
else
saved_month=$(awk '{print $1}' $TRAFFIC_FILE)
if [ "$saved_month" != "$CURRENT_MONTH" ]; then
echo "$CURRENT_MONTH 0 0" > $TRAFFIC_FILE
# 月初先删除日志,再重建日志文件
rm $LOG_FILE
touch $LOG_FILE
log_message "流量文件月份更新"
fi
fi
# 读取之前的流量记录
read saved_month last_total_out last_check_out < $TRAFFIC_FILE
# 获取当前接收和发送的字节数
if ! out_bytes=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes); then
log_message "无法读取发送字节数"
exit 1
fi
# 如果上次检查值大于当前值,说明流量可能已被重置
if [ "$out_bytes" -lt "$last_check_out" ]; then
log_message "检测到网卡流量重置,恢复累积流量"
last_check_out=0
fi
# 计算增量流量
delta_out=$((out_bytes - last_check_out))
# 计算启动前后的累计流量
total_out=$((last_total_out + delta_out))
total_bytes=$((total_out))
# 检查是否达到阈值
if [ "$total_bytes" -ge "$SHUTDOWN_THRESHOLD" ]; then
log_message "总流量已达到19GB,五分钟后关机"
sleep 5m
poweroff
fi
# 自适应单位输出
if [ $total_bytes -lt 1024 ]; then
total="$total_bytes bytes"
elif [ $total_bytes -lt $((1024 * 1024)) ]; then
total=$(echo "scale=2; $total_bytes / 1024" | bc)
total="$total KB"
elif [ $total_bytes -lt $((1024 * 1024 * 1024)) ]; then
total=$(echo "scale=2; $total_bytes / 1024 / 1024" | bc)
total="$total MB"
else
total=$(echo "scale=2; $total_bytes / 1024 / 1024 / 1024" | bc)
total="$total GB"
fi
# 输出结果
log_message "$total"
echo "$(date +%R) This Month: $total"
echo "------------------------------"
# 将当前流量值保存到文件
echo "$CURRENT_MONTH $total_out $out_bytes" > $TRAFFIC_FILE
复制代码
作者:
种植业生产人员
时间:
2024-9-18 19:23
牛逼
作者:
joshuabu
时间:
2024-9-18 19:33
牛鼻
作者:
似毛非毛
时间:
2024-9-18 19:36
mark一下。不知道openwrt能用不
作者:
jayvzh
时间:
2024-9-20 09:32
感谢楼主,补充debian的,
修改eth0和自己网卡一致,文件编码utf8,chmod +x 执行权限
#!/bin/bash
# 获取当前脚本的绝对路径
SCRIPT_PATH=$(realpath "$0")
# 保存流量数据的目录和文件
TRAFFIC_DIR="/root/network_traffic"
TRAFFIC_FILE="$TRAFFIC_DIR/network_traffic.dat"
LOG_FILE="$TRAFFIC_DIR/network_traffic_monitor.log"
CURRENT_MONTH=$(date +"%Y-%m")
SHUTDOWN_THRESHOLD=$((19 * 1024 * 1024 * 1024)) # 19GB 转换为字节的整数表示
# 要监控的网络接口
INTERFACE="eth0"
# 创建保存流量数据的目录
if [ ! -d "$TRAFFIC_DIR" ]; then
mkdir -p "$TRAFFIC_DIR"
if [ $? -eq 0 ]; then
echo "目录 $TRAFFIC_DIR 创建成功"
else
echo "无法创建目录 $TRAFFIC_DIR"
exit 1
fi
fi
# 定义日志记录函数
log_message() {
local message="$1"
echo "$(date +"%Y-%m-%d %H:%M:%S") - $message" >> $LOG_FILE
}
# 初始化日志文件
if [ ! -f $LOG_FILE ]; then
touch $LOG_FILE
log_message "日志文件创建成功"
fi
# 如果流量文件不存在或者月份不同,则创建并初始化
if [ ! -f $TRAFFIC_FILE ]; then
echo "$CURRENT_MONTH 0 0" > $TRAFFIC_FILE
log_message "流量文件创建成功"
else
saved_month=$(awk '{print $1}' $TRAFFIC_FILE)
if [ "$saved_month" != "$CURRENT_MONTH" ]; then
echo "$CURRENT_MONTH 0 0" > $TRAFFIC_FILE
# 月初先删除日志,再重建日志文件
rm $LOG_FILE
touch $LOG_FILE
log_message "流量文件月份更新"
fi
fi
# 读取之前的流量记录
read saved_month last_total_out last_check_out < $TRAFFIC_FILE
# 获取当前接收和发送的字节数
if ! out_bytes=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes); then
log_message "无法读取发送字节数"
exit 1
fi
# 如果上次检查值大于当前值,说明流量可能已被重置
if [ "$out_bytes" -lt "$last_check_out" ]; then
log_message "检测到网卡流量重置,恢复累积流量"
last_check_out=0
fi
# 计算增量流量
delta_out=$((out_bytes - last_check_out))
# 计算启动前后的累计流量
total_out=$((last_total_out + delta_out))
total_bytes=$((total_out))
# 检查是否达到阈值
if [ "$total_bytes" -ge "$SHUTDOWN_THRESHOLD" ]; then
log_message "总流量已达到19GB,五分钟后关机"
sleep 5m
/sbin/poweroff # 使用完整路径
fi
# 自适应单位输出
if [ $total_bytes -lt 1024 ]; then
total="$total_bytes bytes"
elif [ $total_bytes -lt $((1024 * 1024)) ]; then
total=$(echo "scale=2; $total_bytes / 1024" | bc)
total="$total KB"
elif [ $total_bytes -lt $((1024 * 1024 * 1024)) ]; then
total=$(echo "scale=2; $total_bytes / 1024 / 1024" | bc)
total="$total MB"
else
total=$(echo "scale=2; $total_bytes / 1024 / 1024 / 1024" | bc)
total="$total GB"
fi
# 输出结果
log_message "$total"
echo "$(date +%R) This Month: $total"
echo "------------------------------"
# 将当前流量值保存到文件
echo "$CURRENT_MONTH $total_out $out_bytes" > $TRAFFIC_FILE
复制代码
脚本用到bc注意安装:
apt install bc cron
crontab -e
*/10 * * * * /bin/bash /root/network_traffic/cdt-shuntdown.sh >/dev/null
作者:
随波逐流
时间:
2024-9-20 09:36
好帖子,都支持下
作者:
xxrrrrr
时间:
2024-9-20 11:20
如何做到流量到限制值后,关闭指定的几个服务,这样就不用关机了,还可以用探针服务查看信息
作者:
u78
时间:
2024-9-20 11:28
xxrrrrr 发表于 2024-9-20 11:20
如何做到流量到限制值后,关闭指定的几个服务,这样就不用关机了,还可以用探针服务查看信息 ...
把关机的指令改成杀死程序的就行了.....
欢迎光临 全球主机交流论坛 (https://443502.xyz/)
Powered by Discuz! X3.4