Shell检测文件大小
目录
关于检测文件的更详细说明请访问《NWPC业务系统笔记:检查输出数据》
最近业务系统出现的某几次故障,都与文件不完整有关系。用 test -f
只能检测文件是否存在,但模式的输出是分段进行的,文件IO也需要一些时间,当 test -f
通过时,文件可能正在输出当中。这种情况下继续运行程序就会出错。
一种解决方法是检测文件的大小。因为每个 modelvar 文件大小相同,可以通过检测文件大小判断数据文件的完整性。
方法
使用下面的命令获取文件大小
ls -l ${file_path} | awk '{ print $5 }
使用 test
判断文件大小是否满足要求
[ ${checked_file_size} -ge ${file_size} ]
实际应用
我们的业务系统使用 ECMWF 开发的 SMS 提交作业。 SMS 脚本中检查文件函数首先检测文件是否存在,如果参数中给定文件大小,则比较文件大小。
check_data_file()
{
file_path=$1
file_label=$2
label_prefix=$3
check_file_size_flag=0
if [ $# -eq 4 ]; then
check_file_size_flag=1
file_size=$4
fi
count=0
get_data=0
smslabel info "${label_prefix}...${file_label}"
echo "${label_prefix}...${file_label}"
while [ ${count} -lt ${max_check_count} ] && [ ${get_data} -ne 1 ]
do
smslabel info "${label_prefix}...${file_label}...${count}/${max_check_count}"
echo "${label_prefix}...${file_label}...${count}/${max_check_count}"
if [ -s ${file_path} ]; then
if [ ${check_file_size_flag} -eq 1 ]; then
echo "${label_prefix}...${file_label}...${count}/${max_check_count}: check file size"
checked_file_size=$(ls -l ${file_path} | awk '{ print $5 }')
if [ ${checked_file_size} -ge ${file_size} ]; then
get_data=1
echo "${label_prefix}...${file_label}...${count}/${max_check_count}: check file size success"
else
echo "${label_prefix}...${file_label}...${count}/${max_check_count}: check file size failed"
sleep ${sleep_seconds_for_check}
fi
else
get_data=1
fi
else
sleep ${sleep_seconds_for_check}
fi
count=$(($count+1))
done
if [ $get_data -eq 0 ];then
smslabel info "${label_prefix}...${file_label}...failed (too many times)"
echo "${label_prefix}...${file_label}...failed (too many times)"
return 1;
fi
smslabel info "${label_prefix}...${file_label}...found"
echo "${label_prefix}...${file_label}...found"
return 0;
}
调用函数的方法
check_data_file \
${modelvar_data_dir}/modelvar${start_date}${ftime}00 \
"modelvar" \
"checking for ${ftime}..." \
${modelvar_file_size}