【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

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删