【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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1