Shell检测文件大小

目录

最近业务系统出现的某几次故障,都与文件不完整有关系。用 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}