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

Bash目录文件数量监控脚本异常求助:为何未按预期运行?

Bash目录监控脚本问题排查与修复

需求说明

脚本需监控指定目录,满足以下任一条件时退出:

  • 目录中匹配指定掩码的文件数量达到预期值,状态码0退出
  • 到达设定的超时时间(小时),无论文件数量是否达标,状态码0退出

脚本使用方式

./filemonitor.sh <file_path> <file_mask> <file_amount> <expire_hour>

示例:

./filemonitor.sh /home/abc/ dl*.txt 5 14

问题脚本

#!/bin/bash

# Variables
now=$(date +"%H")

# User input
files_path=$1
files_msk=$2
files_qtde=$3
files_lmttime=$4

check() {

    while :; do

        file_count=$(find $files_path -mindepth 1 -maxdepth 1 -type f -iname "$files_msk" | wc -l)

        if [ $file_count -lt $files_qtde ]; then

            if [ $now -ge $files_lmttime ]; then

                echo 'Time is over!'
                exit 1

            elif [ $now -lt $files_lmttime ]; then

                echo 'On time, process running'
                echo 'Wait 5 secs'
                sleep 5

            fi

        elif [ $file_count -eq $files_qtde ]; then

            echo "file count="$file_count "file expected="$files_qtde
            echo 'Files OK'
            exit 0

        fi

    done
}

check

问题分析

  1. 时间变量未实时更新:now仅在脚本启动时获取一次小时数,循环中不会重新获取当前时间,导致超时判断永远基于初始时间,无法正确检测到超时。
  2. 超时退出状态码错误:需求要求超时后以状态码0退出,但原脚本执行exit 1,不符合要求。
  3. 路径未做引号包裹:find $files_path如果路径包含空格,会导致命令解析错误,需用双引号包裹变量。
  4. 缺少参数校验:未检查用户输入参数是否完整,参数不足时脚本会出现逻辑错误。
  5. 变量命名不直观:files_qtde、files_lmttime等变量名可读性差,建议改为更清晰的命名。

修复后的脚本

#!/bin/bash

# 参数校验:检查输入参数数量是否为4
if [ $# -ne 4 ]; then
    echo "用法错误:$0 <file_path> <file_mask> <file_amount> <expire_hour>"
    exit 1
fi

# 定义变量
file_path="$1"
file_mask="$2"
target_count="$3"
expire_hour="$4"

check_monitor() {
    while true; do
        # 实时获取当前小时数
        current_hour=$(date +"%H")
        
        # 统计匹配掩码的文件数量(路径加引号避免空格问题)
        file_count=$(find "$file_path" -mindepth 1 -maxdepth 1 -type f -iname "$file_mask" | wc -l)

        # 判断文件数量是否达标
        if [ "$file_count" -eq "$target_count" ]; then
            echo "文件数量达标:当前=$file_count,预期=$target_count"
            echo "监控完成"
            exit 0
        fi

        # 判断是否超时
        if [ "$current_hour" -ge "$expire_hour" ]; then
            echo "已到超时时间,退出监控"
            exit 0
        fi

        # 未达标且未超时,等待5秒后重试
        echo "当前文件数量=$file_count(未达标),继续监控,等待5秒..."
        sleep 5
    done
}

check_monitor

修复要点说明

  • 新增参数校验,确保用户输入正确的参数数量
  • 循环内实时获取current_hour,保证超时判断的准确性
  • 修正超时退出的状态码为0,符合需求要求
  • 对file_path变量添加双引号,避免路径含空格时的命令错误
  • 优化变量命名,提升脚本可读性
  • 调整逻辑顺序,先判断文件数量达标,再判断超时,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:40:48