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

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动