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
问题分析
- 时间变量未实时更新:
now仅在脚本启动时获取一次小时数,循环中不会重新获取当前时间,导致超时判断永远基于初始时间,无法正确检测到超时。 - 超时退出状态码错误:需求要求超时后以状态码0退出,但原脚本执行
exit 1,不符合要求。 - 路径未做引号包裹:
find $files_path如果路径包含空格,会导致命令解析错误,需用双引号包裹变量。 - 缺少参数校验:未检查用户输入参数是否完整,参数不足时脚本会出现逻辑错误。
- 变量命名不直观:
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
相关产品推荐
相关产品推荐

