You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控wget下载文件,每增2MB自动执行指定命令?

嘿,我完全懂你现在的麻烦——手动嵌套一堆while循环来硬编码每个大小阈值,不仅写起来累,后续要调整阈值或者加新的阈值简直是噩梦。咱们可以用更灵活、可扩展的方式来实现这个需求,不用重复写一堆循环代码。

下面给你两种方案,分别对应「自定义固定阈值」和「每增加指定大小就触发」的场景,你可以按需选择:

方案1:自定义固定阈值列表

如果你有明确的几个大小阈值(比如2MB、4MB、6MB...),可以把这些阈值放到一个数组里,然后循环监控文件大小,自动依次检查每个阈值:

#!/bin/bash

# 配置参数,按需修改
TARGET_FILE="/home/user/test.mp4"
# 阈值列表,单位KB(2MB=2048KB,可随意添加/删除阈值)
THRESHOLDS=(2048 4096 6144 8192 10240)
# 触发阈值时要执行的命令,复杂逻辑可以写成函数
ON_THRESHOLD_TRIGGER="echo '达到阈值,执行自定义命令'"

# 初始化变量
current_threshold_idx=0
total_thresholds=${#THRESHOLDS[@]}

# 先等wget创建出目标文件
while [ ! -f "$TARGET_FILE" ]; do
    sleep 1
done

# 开始循环监控
while [ $current_threshold_idx -lt $total_thresholds ]; do
    # 获取当前文件大小(单位KB),用stat比du更快,因为直接读文件元数据
    current_size=$(stat -c%s "$TARGET_FILE")
    current_size=$((current_size / 1024)) # 转成KB
    current_threshold=${THRESHOLDS[$current_threshold_idx]}

    # 检查是否达到当前阈值
    if [ $current_size -ge $current_threshold ]; then
        echo "✅ 文件大小已达 $((current_threshold/1024)) MB,执行命令..."
        $ON_THRESHOLD_TRIGGER
        current_threshold_idx=$((current_threshold_idx + 1)) # 切换到下一个阈值
    fi

    # 检查下载是否完成:如果5秒内文件大小没变化,认为下载结束
    prev_size=$current_size
    sleep 5
    new_size=$(stat -c%s "$TARGET_FILE" | awk '{print int($1/1024)}')
    if [ $prev_size -eq $new_size ]; then
        echo "📥 文件已下载完成,退出监控"
        break
    fi
done

echo "监控结束"

这个方案的好处是:只要修改THRESHOLDS数组就能调整阈值,不用改循环结构,扩展性拉满。

方案2:每增加指定大小自动触发

如果你的需求是每增加2MB就执行一次命令(而不是固定几个阈值),可以用动态计算阈值的方式,每次触发后自动更新下一个阈值:

#!/bin/bash

# 配置参数
TARGET_FILE="/home/user/test.mp4"
INCREMENT_KB=2048 # 每次触发的增量(2MB=2048KB)
ON_INCREMENT_TRIGGER="echo '文件大小增加了2MB,执行自定义命令'"

# 等待目标文件创建
while [ ! -f "$TARGET_FILE" ]; do
    sleep 1
done

# 获取初始大小,计算第一个触发阈值
initial_size=$(stat -c%s "$TARGET_FILE" | awk '{print int($1/1024)}')
next_trigger_threshold=$((initial_size + INCREMENT_KB))

while true; do
    current_size=$(stat -c%s "$TARGET_FILE" | awk '{print int($1/1024)}')

    # 检查是否达到增量阈值
    if [ $current_size -ge $next_trigger_threshold ]; then
        echo "✅ 文件大小已增加2MB,当前大小 $((current_size/1024)) MB"
        $ON_INCREMENT_TRIGGER
        next_trigger_threshold=$((next_trigger_threshold + INCREMENT_KB)) # 更新下一个阈值
    fi

    # 检查下载完成状态
    prev_size=$current_size
    sleep 5
    new_size=$(stat -c%s "$TARGET_FILE" | awk '{print int($1/1024)}')
    if [ $prev_size -eq $new_size ]; then
        echo "📥 下载完成,退出监控"
        break
    fi
done

这个方案完全不用手动列阈值,只要设置好增量大小,就能自动循环触发,非常适合持续增量监控的场景。

一些小提示

  • 可以把要执行的复杂命令写成bash函数,比如:
    my_custom_command() {
        # 这里写你的复杂逻辑,比如日志记录、调用其他脚本等
        echo "当前时间: $(date),文件大小: $1 KB" >> download_monitor.log
    }
    
    然后在触发时调用my_custom_command $current_size。
  • 调整sleep的时间:如果需要更灵敏的监控,可以把sleep 5改成sleep 1,但不要太频繁,避免占用过多系统资源。
  • 检测wget进程:如果担心文件大小不变但wget还在运行,可以加个进程检查,比如pgrep wget,如果返回空就退出循环。

内容的提问来源于stack exchange,提问作者Santhosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:02:08