管道执行tar压缩及S3上传的有效性校验方法咨询
现有命令问题说明
你当前使用的命令存在逻辑错误:将tar命令的标准输出通过反引号捕获赋值给变量COMPRESSING_0,会导致管道左侧没有数据流传入aws s3 cp命令,即使上传成功也没有写入有效内容,建议先调整为正确的管道写法:
tar cvzf - "$BACKUP_PATH_DB/$YEAR_MONTH/${DB_NAME}-${DATE}.bak" | aws s3 cp - s3://db-bckp/db/${DB_NAME}.tar.gz
问题1:管道中校验tar压缩操作是否成功
- 方法1:通过
PIPESTATUS数组获取管道中每一步命令的退出码。Bash中PIPESTATUS数组会按顺序保存最近一次管道中所有命令的退出状态码,0代表执行成功,非0代表执行失败:# 执行完管道命令后立即取值 tar_exit_code=${PIPESTATUS[0]} if [ $tar_exit_code -ne 0 ];then echo "tar压缩失败,错误码:$tar_exit_code" exit 1 fi - 方法2:压缩同时生成内容校验值,用于后续全量校验文件完整性:
# 压缩同时将流复制一份生成本地sha256校验文件 tar cvzf - "$BACKUP_PATH_DB/$YEAR_MONTH/${DB_NAME}-${DATE}.bak" | tee >(sha256sum > ./backup_sha256.txt) | aws s3 cp - s3://db-bckp/db/${DB_NAME}.tar.gz
问题2:校验S3上传是否成功
- 方法1:同样通过
PIPESTATUS数组获取aws cli命令的退出码,aws cli执行成功返回0,非0代表上传过程出现错误:s3_exit_code=${PIPESTATUS[1]} if [ $s3_exit_code -ne 0 ];then echo "S3上传失败,错误码:$s3_exit_code" exit 1 fi - 方法2:上传完成后主动查询S3文件信息校验存在性和大小:
# 查询文件是否存在并获取大小 s3_file_info=$(aws s3 ls s3://db-bckp/db/${DB_NAME}.tar.gz) if [ -z "$s3_file_info" ];then echo "S3目标文件不存在,上传失败" exit 1 fi - 方法3:校验文件内容一致性,适合对备份完整性要求高的场景:
# 拉取S3文件流和本地校验值比对,无需占用本地磁盘存储临时文件 aws s3 cp s3://db-bckp/db/${DB_NAME}.tar.gz - | sha256sum -c ./backup_sha256.txt if [ $? -ne 0 ];then echo "S3文件内容校验不通过,备份损坏" exit 1 fi
内容的提问来源于stack exchange,提问作者Nkk
相关产品推荐
相关产品推荐

