如何监控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
相关产品推荐
相关产品推荐

