【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

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

centos6一键安装vsftpd脚本

centos6一键安装vsftpd脚本 手动安装vsftpd参考教程:Centos下安装Vsftpd的图文教程 vsftpd脚本功能: 1.安装 (命令执行:sh xxx.sh)2.添加ftp用户 (命令执行:sh xxx.sh add)3.卸载vsftpd (命令执行:sh xxx.sh uninstall) 测试环境:centos6 x64 centos6 x86(测试centos7以

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat