当前位置: 首页 > news >正文

一个清理脚本的改进思路(r5笔记第51天)

前几天同事问我一个问题,说在unix环境下有个目录下的文件/文件夹太多了,已经报了开始报系统错误了,客户希望能够定时进行这些目录的清理。我连到那个环境去查看,ls都需要等待很长时间没有反应,最后尝试使用find命令,根据文件名来查找的时候反应才相对要快一些。同事计划使用crontab来实现。使用的命令大体如下:59 23 1 1,4,7,10 * find /xxxx/tmp -mtime +90 -type d -print|xargs rm –rf

其中关键的地方是使用了xargs,根据我之前的测试,发现xargs在大批量的文件过滤时,效果还是不能让人满意的,而且在命令最后接入rm -rf,如果出现什么纰漏,那影响可就大了。

根据分析,发现其实在几个目录下药删除的文件目录命名规则都比较固定。比如是20141201的日志,命名就类似下面的形式。container-default-instanceJob-201412001_xxxxxx其中变化的部分主要是时间的部分,所以决定使用find -name的方式效果要好一些,但是find -name结合xargs的时候如果文件比较多,删除的时候还是有问题,而且rm -rf的潜在隐患还是有。一种比较直接的方式就是我们生成对应的文件目录名,如果匹配,则删除,如果不匹配,也不会报出错误。比方说我们根据需要删除字2014年12月1日起某些天的记录,则可以手工指定对应的文件名和时间戳。rm -rf /xxxx/tmp/container-default-instanceJob-20141202*rm -rf /xxxx/tmp/container-default-instanceJob-20141203*rm -rf /xxxx/tmp/container-default-instanceJob-20141204*rm -rf /xxxx/tmp/container-default-instanceJob-20141205*rm -rf /xxxx/tmp/container-default-instanceJob-20141206*rm -rf /xxxx/tmp/container-default-instanceJob-20141207*这种方式会避免不少的问题,删除速度是没有问题的。而且可以避免很多意外的情况。但是缺点就是太手动了,感觉没什么技术含量。我们来把这个过程自动化一下。能够动态生成对应的文件目录名,每次运行之后都会把基准的时间重新调整。比如我们删除60天的记录,假设起始时间为20141201,则60天后就是20150130,第二次运行这个命令就会把起始时间自动调整为20150130,终止时间就是20150331了。第一次运行命令后,生成的删除命令为:rm -rf /xxxx/tmp/container-default-instanceJob-20141202*....rm -rf /xxxx/tmp/container-default-instanceJob-20150130*第二次运行同样的命令,生成的删除命令为:rm -rf /xxxx/tmp/container-default-instanceJob-20150130*....rm -rf /xxxx/tmp/container-default-instanceJob-20150331*这种方式就比较动态了,而且删除起来也是一个很稳定的过程。首先采用shell的形式写了如下的脚本。GetIncDate(){ L_DAY=$1 days=$2 L_TODAY=$(printf "%(%Y%m%d)T\n" "${L_DAY}0000 + ${days} day") print ${L_TODAY}} function gen_clean_script{for i in {1..$duration}doecho 'rm -rf /xxxxx/tmp/container-default-instanceJob-'`GetIncDate $initdate $i` >> gen_clean_script.shdone}这种方式基于Linux环境实现,可以灵活的使用date命令的选项进行时间的计算。但是问题来了,在Linux下可行的方案在unix底下没有那些个命令选项。也就是说这个shell脚本在unix下运行不了。问题还是基于一些命令的兼容性。最后尝试把时间的计算用sql来实现,这样也不会存在平台的限制。写出的基于sql计算时间的shell脚本如下:function gen_clean_script{conn_str=$3print "conn $conn_strset linesize 200set serveroutput onset feedback offbeginfor i in 1..$2 loopdbms_output.put_line('rm -rf /xxxxx/tmp/container-default-instanceJob-'||to_char(to_date('$1','yyyymmdd')+i,'yyyymmdd')||'*');end loop;end;/" |sqlplus -s /nolog > gen_clean_script.sh}function get_next_date{conn_str=$3print "conn $conn_strset serveroutput onset feedback offbegindbms_output.put_line(to_char(to_date('$1','yyyymmdd')+$2,'yyyymmdd'));end;/" |sqlplus -s /nolog > init.date}conn_str=n1/n1@xxxxduration=60if [[ ! -s init.date ]] ;thenecho '***********************************************'echo '20141201' > init.dateinitdate=20141201echo $initdateecho '***********************************************'elseinitdate=`cat init.date`figen_clean_script $initdate $duration $conn_strget_next_date $initdate $duration $conn_strcat gen_clean_script.sh 问题的解决就有了一种相对比较可行的思路,这种方案有一个缺点就是需要连接数据库,不过对于数据库用户的配置没有其它要求,只要能运行sql查询即可。

相关文章:

  • 我身边的一些数据库事故 (r5笔记第52天)
  • 关于网络捐款 (r5笔记第53天)
  • 11g Active DataGuard初探(r5笔记第54天)
  • 半自动化运维之动态添加数据文件(一) (r5笔记第55天)
  • 半自动化运维之动态添加数据文件(二) (r5笔记第56天)
  • 无法运行的update问题解析(r5笔记第57天)
  • shell中echo的显示格式 (r5笔记第58天)
  • 人的力量和大自然的力量 (r5笔记第59天)
  • 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
  • 巧用外部表备份历史数据(r5笔记第62天)
  • pl/sql中的forall简单测试(r5笔记第63天)
  • 一次ORA-00600问题的排查和分析(上)(r5笔记第64天)
  • 一次ORA-00600问题的排查和分析(下)(r5笔记第65天)
  • 毕业设计的小故事(r5笔记第67天)
  • 重启数据库的一场闹剧(r5笔记第68天)
  • AHK 中 = 和 == 等比较运算符的用法
  • Android Studio:GIT提交项目到远程仓库
  • angular2 简述
  • canvas绘制圆角头像
  • CAP 一致性协议及应用解析
  • CentOS 7 防火墙操作
  • es6
  • leetcode386. Lexicographical Numbers
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Making An Indicator With Pure CSS
  • Nodejs和JavaWeb协助开发
  • REST架构的思考
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 关于springcloud Gateway中的限流
  • 一些关于Rust在2019年的思考
  • 阿里云服务器购买完整流程
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十六)Flask之蓝图
  • (一)u-boot-nand.bin的下载
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net专家(高海东的专栏)
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • [ C++ ] STL---stack与queue
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [emacs] CUA的矩形块操作很给力啊
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.