【shell脚本】清理指定时间之前的超期文件

2023-10-11 12:10

本文主要是介绍【shell脚本】清理指定时间之前的超期文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

正常运行的服务器每天都会产生大量的日志,如果长时间不清理,会导致磁盘使用率过载,严重的会影响IO密集型操作,比如数据库查询操作的性能。如果有一个监控磁盘使用率的脚本,当检测到磁盘使用率超过指定阈值后,就去清理日志文件,就可以避免这种情况。

原理

清理日志的原理,就是通过du -h命令获得服务器相关使用信息,然后配合awk命令截取到磁盘使用率那一列,就可以得到当前时间服务器的磁盘使用率数据,然后再通过find 目录 type -f -cmin命令找到超期的文件进行清理。

脚本

#!/bin/bash
# 要清理日志的目录,默认将日志同步到该目录下面,没有该目录提前新建好,主要属主和属组为ld,不要使用sudo mkdir命令,目录不要使用~有时会导致问题
# 使用方式,可以直接执行该脚本removeLog.sh,也可以指定要清理日志的路径,比如./removeLog.sh /home/ld/synclog/logs# getStrLen get input arg length
function getStrLen() {str=$1return ${#str}
}# 清理距现在多久之前生成的文件
function removeLogByTime() {# 在指定日期列表中找到这个时间之前的文件,即为要清除的过期文件for time in ${times[@]}do# 通过df命令过滤磁盘使用率那一列得到具体数值free_ratio=`df | grep '/$'| awk '{print $(NF-1)}' | awk -F'%' '{print $1}'`if ((free_ratio>$diskUsed)); thenecho "============= oversive ============" >> $logPathecho "开始清理,$(date "+%Y-%m-%d %H:%M:%S")剩余$free_ratio%" >> $logPathif [ ! -d "$targetDir" ]thenecho "想要清理的日志目录$targetDir不存在"fi# 获取要清理的超期文件列表clearFiles=$(find $targetDir -type f -cmin +$time | xargs)if [ ${#clearFiles} -le 0 ]; then echo "当前目录$targetDir没有超期$(expr $time / 1440)天的文件" >> $logPathbreakfiecho "时间$(date "+%Y-%m-%d %H:%M:%S"),将要清理的文件有:${clearFiles[@]}" >> $logPath`find $targetDir -type f -cmin +$time | xargs rm -f`if [ $? -ne 0 ]then echo "时间$(date "+%Y-%m-%d %H:%M:%S"),清理文件:find $targetDir -type f -cmin +$time | xargs 失败" >> $logPathfiecho "清理距离现在$(expr $time / 1440)天数据后,当前$(date "+%Y-%m-%d %H:%M:%S")剩余磁盘空间$free_ratio%" >> $logPathelseecho "============ normal ===========" >> $logPathecho "未达到设定的磁盘利用率$diskUsed,暂不清理,当前$(date "+%Y-%m-%d %H:%M:%S")剩余磁盘空间$free_ratio%" >> $logPathbreakfidone
}# ============== var ==============
defaultDir="$HOME/synclog"
# 获取将要清理日志所在的目录,可以从输入参数中获取,无输入使用默认目录
getStrLen $1
# 判断脚本是否带有目录参数,如果不带参数,使用存放日志的默认路径
if [[ $? -le 0 ]]; then# targetDir="/var/log/a4stack/erms"targetDir=$defaultDir
# 如果脚本带有路径参数,判断该参数指定目录是否存在
elif [ -d "$1" ]; then targetDir=$1
elseecho "想要清理的目标日志目录$logDir不存在,请检查,清理程序将退出!" >> $logPathexit 1
fi# 清理过程产生的日志目录
logDir="$HOME/.synclog"
# 清理过期文件日志
logFile="clear.txt"
# 记录清理过程产生日志的路径
logPath="$logDir/$logFile"
# 磁盘使用率,超过该值时开始清理日志
diskUsed=30
# 时间单位:分钟
times=("10")# 清理日志的目录不存在则创建
if [ ! -d "$logDir" ]; thenmkdir -p logDir
fiecho "$(date "+%Y-%m-%d %H:%M:%S") start, clear distination dir=$logDir/$logFile, log record path=$logPath" >> $logPathremoveLogByTime

定时执行

如何才能将上面清理日志的脚本定时执行呢?可以使用crontab。
crondtab是Linux系统中用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,crondtab进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

将上面的脚本clear.sh脚本通过“crontab -e” 添加到定时任务中,清理日志的脚本即可在后台定时清理。下面的命令是每5分钟执行一次清理日志的脚本,并将执行日志追加到cron.log文件中。

crontab -e
*/5 * * * * /home/xx/clear.sh >> /tmp/cron.log 2>&1

正确或错误日志的输出是否写入到文件有不同的写法,下面是几个定时执行的例子。

1.不输出任何内容

*/1 * * * * /root/XXXX.sh >/dev/null 2>&1 
# 或
# */1 * * * * /root/XXXX.sh &>/dev/null    //&表示任何内容

2.将正确和错误日志都输出到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1

3.只输出正确日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log
# 或
# */1 * * * * /root/XXXX.sh 1> /tmp/load.log    //1可以省略

4.只输出错误日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh 2> /tmp/load.log

释义:

/dev/null 代表空设备文件
>>> 代表重定向到哪里,而>会覆盖,>>以在文件末尾追加的方式写入文件。
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
>&是一个整体,不可分开,分开后就不是上述含义了
2>&1,表示将标准错误输出重定向到标准输出

在shell脚本中,默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 。
在Linux系统中,定时任务执行命令中的0、1、2通常表示的是一个文件描述符,0表示标准输入、1表示标准输出、2表示标准错误输出。
Linux中的文件描述符

参考

根据磁盘量,自动清理日志文件脚本
整理全网Shell脚本合集,Java脚本,运维脚本,告警脚本,监控脚本,日志脚本,docker脚本等---------持续更新!
shell脚本-读取配置文件返回变量
shell取 配置文件内 参数值
运行shell脚本时报错[[ : not found解决方法
shell脚本语言的使用(超全超详细)
一篇教会你写90%的shell脚本(入门小结)
shell array的一些特殊属性[*],[@]
shell: 统计当前目录下文件数 文件夹数 文件夹和文件总数
Linux 定时执行shell脚本命令之crontab
Shell重定向 &>file、2>&1、1>&2 、/dev/null的区别
Ubuntu下crontab的安装和使用

这篇关于【shell脚本】清理指定时间之前的超期文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187949

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、