一个清理脚本的改进思路

简介: 前几天同事问我一个问题,说在unix环境下有个目录下的文件/文件夹太多了,已经报了开始报系统错误了,客户希望能够定时进行这些目录的清理。 我连到那个环境去查看,ls都需要等待很长时间没有反应,最后尝试使用find命令,根据文件名来查找的时候反应才相对要快一些。
前几天同事问我一个问题,说在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}
do
echo 'rm -rf /xxxxx/tmp/container-default-instanceJob-'`GetIncDate $initdate $i` >> gen_clean_script.sh
done
}

这种方式基于Linux环境实现,可以灵活的使用date命令的选项进行时间的计算。
但是问题来了,在Linux下可行的方案在unix底下没有那些个命令选项。也就是说这个shell脚本在unix下运行不了。问题还是基于一些命令的兼容性。


最后尝试把时间的计算用sql来实现,这样也不会存在平台的限制。
写出的基于sql计算时间的shell脚本如下:

function gen_clean_script
{
conn_str=$3
print "
conn  $conn_str
set linesize 200
set serveroutput on
set feedback off
begin
for i in 1..$2 loop
dbms_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=$3
print "
conn  $conn_str
set serveroutput on
set feedback off
begin
dbms_output.put_line(to_char(to_date('$1','yyyymmdd')+$2,'yyyymmdd'));

end;
/
" |sqlplus -s /nolog > init.date
}


conn_str=n1/n1@xxxx
duration=60
if [[ ! -s init.date ]] ;then
echo '***********************************************'
echo '20141201' > init.date
initdate=20141201
echo $initdate
echo '***********************************************'
else
initdate=`cat init.date`
fi

gen_clean_script $initdate $duration $conn_str
get_next_date $initdate $duration $conn_str


cat gen_clean_script.sh 
问题的解决就有了一种相对比较可行的思路,这种方案有一个缺点就是需要连接数据库,不过对于数据库用户的配置没有其它要求,只要能运行sql查询即可。

目录
相关文章
|
运维 监控 安全
DevOps 测试实践指南
软件开发公司一直在采用 DevOps,因为它有助于自动化和简化应用程序的开发生命周期。不仅如此,DevOps 还通过规划、沟通、流程和工具,更好地协调了开发团队和运维团队,从而提高了项目的交付质量和速度。但是测试 DevOps 的最佳策略是什么呢?本文将讨论 DevOps 的基本概念、生命周期、最佳实践以及我们应该使用的工具。
874 0
DevOps 测试实践指南
|
域名解析 网络协议 视频直播
视频直播推流拉流慢、卡顿解决方案
视频直播类App当前已经普遍采用CDN来实现访问加速,但还是经常遇到推拉流慢、卡顿的问题。这类问题一般是由于调度不精准、域名劫持、终端手机接入网络动态切换等因素导致,结合使用CDN和HTTPDNS可以比较完美解决此类问题。
2347 0
视频直播推流拉流慢、卡顿解决方案
|
新零售 人工智能 安全
云上未来,数智导航:阿里云研究院报告合集
阿里云研究院,甄选了2021-2022年度的10份重磅报告,分别从数字经济、行业转型、数字县域等领域,尝试解读、并推动各行各业的转型升级,展望中国数字经济的未来,迎接数字经济发展的春天。
云上未来,数智导航:阿里云研究院报告合集
|
7月前
「闲置竞价域名」货源上新,操作指南请查收
「闲置竞价域名」货源上新,操作指南请查收
150 3
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek估值1500亿美元:AI领域的新星崛起
据外媒Bloomberg报道,DeepSeek的估值已达到1500亿美元,相当于OpenAI估值的一半。在巴黎AI峰会上,DeepSeek成为焦点话题,其影响力甚至延伸至普通民众。据报道,巴黎地铁上的70岁老人也在讨论这一新兴科技公司,显示出DeepSeek不仅在专业领域备受关注,在公众中也引起了广泛兴趣。
666 7
|
8月前
|
自然语言处理 运维 Linux
阿里云操作系统智能助手OS Copilot测评报告及建议
阿里云推出的OS Copilot是一款基于大模型构建的操作系统智能助手,旨在通过自然语言处理技术与操作系统经验的深度融合,为Linux用户提供前所未有的使用体验。它具备自然语言问答、辅助命令执行和系统运维调优等核心功能,极大降低了Linux的学习门槛,提升了工作效率。测试显示,OS Copilot在功能、性能、易用性和实用性方面表现出色,能够帮助用户高效解决问题并优化系统性能。未来,期待其持续优化升级,加入更多实用功能,进一步提升用户体验。
247 4
|
10月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
830 11
|
11月前
|
安全 网络安全 网络虚拟化
100个网络技术中英文术语,收藏收藏!
【10月更文挑战第22天】
1348 5
100个网络技术中英文术语,收藏收藏!
|
11月前
|
人工智能 安全 测试技术
探索AI在软件开发中的应用:提升开发效率与质量
【10月更文挑战第31天】在快速发展的科技时代,人工智能(AI)已成为软件开发领域的重要组成部分。本文探讨了AI在代码生成、缺陷预测、自动化测试、性能优化和CI/CD中的应用,以及这些应用如何提升开发效率和产品质量。同时,文章也讨论了数据隐私、模型可解释性和技术更新等挑战。
|
11月前
|
Cloud Native API 云计算
云原生架构的深度探索与实践####
本文深入探讨了云原生架构的核心概念、技术特点及其在现代软件开发中的应用实践。通过分析云原生架构如何促进企业数字化转型,提升业务敏捷性与可扩展性,本文旨在为读者提供一个全面而深入的理解框架。我们将从云原生的定义出发,逐步深入到其关键技术组件、最佳实践案例及面临的挑战与解决方案,为开发者和企业决策者提供宝贵的参考与启示。 ####