前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本专题(07):文件由cfs到bos

shell脚本专题(07):文件由cfs到bos

作者头像
loong576
发布2022-09-19 17:44:54
2770
发布2022-09-19 17:44:54
举报
文章被收录于专栏:运维ABC运维ABC

一、背景

生产上每天会产生数千个音频文件,大小有几个G。这些文件存放在cfs内,由于cfs使用费用较高,容量较小,需要定期手动转移至空间更大费用更小的bos内。本程序就是将手动操作改为自动化方式。涉及日志输出、文件比对、文件复制、文件删除、监控告警等。

二、名词解释

cfs:文件储存CFS是文件以及协议存储,可以理解为是更高一级的对象储存BOS,文件储存CFS不能做计算,只是网关协议存储,在图片及文件的读写、和安全上级别更高。

bos:对象储存BOS类似于百度云盘,不过是企业级的,对象储存BOS提供一个简单的 Web 服务接口,可用于存储和提取任意数量的数据。 cfs供多台服务器共享使用,使用费用比bos高很多。

三、程序工作逻辑

每天产生的大部分音频文件存放在以日期为名字的目录内,该目录还有一层子目录xxdata,小部分录音文件存放在这个子目录内。首先将n天前的cfs日期目录复制到bos,然后比对是否一致,比对包含md5和diff以及文件数量比较,若都一致则删除原cfs录音文件目录,若有一项不一致则退出,最后通过微信发出成功的通知或失败的告警。

四、日志说明

程序每一步操作都有详细的日志记录,包括源文件目录和目标目录是否存在、复制了哪些文件、删除了哪些文件、md5生成和比对、哪些操作失败了等。程序正常运行或者运行失败都能通过日志定位查看。

五、各模块介绍

本程序共有9个模块,下面一一介绍

1.日志模块logs_bak
代码语言:javascript
复制
logs_bak(){
cp ${LOCAL_LOG}/log.txt ${LOCAL_LOG}/log_${DATE}.txt
echo '' > ${LOCAL_LOG}/log.txt
cp ${ALTER_LOG}/alter.txt ${ALTER_LOG}/alter_${DATE}.txt
echo  -n "" > ${ALTER_LOG}/alter.txt
cp ${MD5_LOG}/md5.txt ${MD5_LOG}/md5_${DATE}.txt
echo '' > ${MD5_LOG}/md5.txt
}
图片.png
图片.png

本程序共有4个日志,分别是all:记录本程序执行过程中的所有动作;alter:只记录各步骤出错内容,如果成功的话该日志为空;cron:记录每天定时任务执行情况;md5:记录md5生成和比对。

除了cron日志外,其它三个日志在程序运行的时候会以日期割接备份。

2.目录检查模块file_check
代码语言:javascript
复制
file_check(){
if [ -d ${SOURCE_PATH} ]
then
    echo "the org_directory_file is existed,now you can cp files from ${SOURCE_PATH}/${DATE}" >> ${LOCAL_LOG}/log.txt 
else
    echo "there is no $DATE directory,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 101
fi
if [ -d ${DEST_PATH} ]
then
    echo "the dest_directory is existed,now you can cp files to ${DEST_PATH}" >> ${LOCAL_LOG}/log.txt
else
    echo "there is no bos directory,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt   
    exit 102
fi
}

检查源文件目录SOURCE_PATH和备份目录DEST_PATH是否存在,因为有可能出现cfs或者bos挂载失败的问题。若路径都在则继续否则报错并退出。

运行日志截图:

图片.png
图片.png
3.生成源文件md5值模块md5_a
代码语言:javascript
复制
md5_a(){
for  list_a in `find ${SOURCE_PATH}/* \( -path $NODATA \)  -prune -o -type f  -print |grep -v md5` 
  do
    FILE_NAME_A=${list_a##*/}
    cd ${SOURCE_PATH}
    md5sum ${FILE_NAME_A} >> ${SOURCE_PATH}/md5_a.txt
  done
if [ "$?" -eq "0" ]
then
    echo "the first md5 file md5_a.txt is created" | tee -a  ${LOCAL_LOG}/log.txt ${MD5_LOG}/md5.txt
else
    echo "the first md5 file md5_a.txt  created fail,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 103
fi
}

获取日期目录第一层的音频文件列表并生成md5文件md5_a.txt,该文件在复制到bos后进行md5比对时会用到。若正常生成该文件则继续,否则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
图片.png
图片.png
4.生成源文件md5值模块md5_b
代码语言:javascript
复制
md5_b(){
for  list_b in `find  ${NODATA}   -type f  -print | grep -v md5` 
  do
    cd ${NODATA}
    FILE_NAME_B=${list_b##*/}
    md5sum ${FILE_NAME_B} >> ${NODATA}/md5_b.txt
  done
if [ "$?" -eq "0" ]
then
    echo "the second md5 file md5_b.txt is created" | tee -a  ${LOCAL_LOG}/log.txt ${MD5_LOG}/md5.txt
else
    echo "the second md5 file md5_b.txt  created fail,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 104
fi
}

获取日期目录第二层的录音文件列表并生成md5文件md5_b.txt,该文件在复制到bos后进行md5比对时会用到。若正常生成该文件则继续,否则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
图片.png
图片.png
5.文件复制模块file_cp
代码语言:javascript
复制
file_cp(){
echo "now ready to copy files from source to dest" | tee -a ${LOCAL_LOG}/log.txt
cp -R ${SOURCE_PATH}  ${DEST_PATH} -vvv >> ${LOCAL_LOG}/log.txt
if [ "$?" -eq "0" ]
then
    echo "the files copy sucessed" | tee -a  ${LOCAL_LOG}/log.txt
else
    echo "the files copy failed,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 105
fi
}

通过cp命令将录音文件由cfs复制到bos,复制过程中详细记录日志。若成功复制则继续,否则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
图片.png
图片.png
6.md5比较模块diff_md5_a
代码语言:javascript
复制
diff_md5_a(){
cd ${DEST_PATH}/${DATE}
echo "this is md5_a compared log"  >> ${MD5_LOG}/md5.txt
md5sum -c md5_a.txt >> ${MD5_LOG}/md5.txt
if [ "$?" -eq "0" ]
then
    echo "the files in ${DATE} except nodata compared Ok" >> ${LOCAL_LOG}/log.txt
    echo "md5_a Ok"
else
    echo "the files in ${DATE} except nodata  compared error,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt 
    exit 106
fi
}

在bos的首层目标目录运行'md5sum -c md5_a.txt'进行第一层的录音文件md5比对,若比对正常则继续,否则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
7.md5比较模块diff_md5_b
代码语言:javascript
复制
diff_md5_b(){    #对目标目录第二层文件进行比对
cd ${DEST_PATH}/${DATE}/nodata
echo "this is md5_b compared log"  >> ${MD5_LOG}/md5.txt
md5sum -c md5_b.txt >> ${MD5_LOG}/md5.txt  
if [ "$?" -eq "0" ]
then
    echo "the files  nodata compared Ok" >> ${LOCAL_LOG}/log.txt
    echo "md5_b Ok"
else
    echo "the files  nodata  compared error,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 107
fi
}

在bos的第二层目标目录运行'md5sum -c md5_b.txt'进行第二层的录音文件md5比对,若比对正常则继续,否则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
8.源文件删除模块org_file_rm
代码语言:javascript
复制
org_file_rm(){
diff ${SOURCE_PATH}  ${DEST_PATH}/${DATE}
result1=$?
diff ${NODATA}  ${DEST_PATH}/${DATE}/nodata
result2=$?
wc1=`ls -lR ${SOURCE_PATH} | grep "^-" | wc -l`
wc2=`ls -lR ${DEST_PATH}/${DATE} | grep "^-" | wc -l`
if [ ${result1} -eq "0" ] && [ ${result2} -eq "0" ] &&  [ ${wc1} -eq ${wc2} ] 
then
    echo "the files diff  Ok, you can rm the source files" >> ${LOCAL_LOG}/log.txt
    rm -rfv ${SOURCE_PATH} >> ${LOCAL_LOG}/log.txt
else 
    echo "the files  diff error,please check" | tee -a  ${LOCAL_LOG}/log.txt  ${ALTER_LOG}/alter.txt
    exit 108
fi
}

自动化删除源录音文件前会进行首层和第二层的diff比对以及源和目标文件个数的比对,若这三个条件都满足则继续,若一个不满足则写入告警日志并退出。

运行日志截图:

图片.png
图片.png
图片.png
图片.png
9.告警或通知模块
代码语言:javascript
复制
#!/bin/bash
DATE=`date -d "20 day ago" +%Y-%m-%d`
cd /log/cfs2bos/alter
if [ -s alter.txt ]; then
    cat alter.txt | while read line;do echo $line;done
    exit 1
else
    echo "the files ${DATE} copy sucessed"
    exit 2
fi

通过spug平台自定义脚本发出告警或者通知消息

图片.png
图片.png

若告警日志为空则发出通知消息'the files ${DATE} copy sucessed',若不为空则发出告警内容。

告警或通知微信截图:

图片.png
图片.png

spug平台详见:自动化运维平台Spug测试

六、运行方式

代码语言:javascript
复制
0 1 * * * /root/cfs2bos.sh >> /log/cfs2bos/cron/cron.txt

本程序采用定时任务方式运行,每天凌晨1点开始。

运行日志截图:

图片.png
图片.png

更多shell文章详见:shell脚本专题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、名词解释
  • 三、程序工作逻辑
  • 四、日志说明
  • 五、各模块介绍
    • 1.日志模块logs_bak
      • 2.目录检查模块file_check
        • 3.生成源文件md5值模块md5_a
          • 4.生成源文件md5值模块md5_b
            • 5.文件复制模块file_cp
              • 6.md5比较模块diff_md5_a
                • 7.md5比较模块diff_md5_b
                  • 8.源文件删除模块org_file_rm
                    • 9.告警或通知模块
                    • 六、运行方式
                    相关产品与服务
                    文件存储
                    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档