为Shell脚本添加文件缺失场景下的异常处理
解决ksh脚本文件缺失时的异常处理问题
原脚本在处理不存在的文件时,会因stat命令报错直接终止执行。下面是添加异常处理后的版本,实现文件缺失时记录日志并继续执行后续文件处理:
#!/bin/ksh .......... while read file do # 检查目标文件是否为存在的普通文件 if [[ ! -f "${file}" ]]; then log_info "文件 ${file} 不存在,跳过处理" continue fi # 安全获取文件修改时间,捕获stat执行错误 stat_output=$(stat -c %Y "${file}" 2>/dev/null) if [[ -z "${stat_output}" ]]; then log_info "无法获取文件 ${file} 的修改时间,跳过处理" continue fi upd_date=$(( $(date +%s) - stat_output )) file_nm=$(basename "${file}") # 优化文件占用检查逻辑,避免冗余进程 if lsof "${file}" >/dev/null 2>&1 || [[ ${upd_date} -lt 60 ]]; then log_info "等待文件 ${file} 传输完成/跳过" else log_info "找到数据文件 ${file}" fi done < "${TEMP}/filepath" ............... exit 0
关键修改说明
- 前置文件校验:通过
-f判断文件是否为普通文件,不存在则直接记录日志并进入下一次循环,避免后续命令报错。 - stat命令错误捕获:将
stat的错误输出重定向到空设备,同时检查输出内容,若为空说明命令执行失败(比如文件在检查后被删除),同样记录日志并跳过。 - 语法优化:用
$()替代反引号执行子命令,可读性更好且支持嵌套写法。 - 性能优化:直接调用
lsof "${file}"判断文件是否被占用,替代原有的lsof | grep,减少不必要的进程创建,同时避免文件名含特殊字符时的匹配错误。
内容的提问来源于stack exchange,提问作者Mr.
相关产品推荐
相关产品推荐

