清理老日志这种需求太常见了

描述

在我做运维的职业生涯里,有超过3成的故障都是因为磁盘被写满导致,而导致磁盘被写满的原因就是日志没有做清理。

磁盘

今天这个脚本需求很简单,就是找到/data/logs/目录下所有以log作为后缀的文件,删除掉60天以前的,并且对一天以前的使用gzip进行压缩(每一个都要压缩)。

其实,这个需求大家不要想复杂了,核心命令就是find,先给大家讲几个find的常见用法。

1)找到一个目录下,所有"*.txt",这里需要考虑到不仅仅该目录下,还要包括该目录的子目录下的*.txt,所以,你要直接  ls  /dir/*.txt 肯定就不合适了,如何找指定名字的文件?使用这个命令:

 

find  /dir/  -name "*.log" 

 

2)找到/data/下10天以前的所有文件,注意只是文件,不包括目录哦

 

find  /data/ -type f -mtime +10

 

3)基于目录层级来查找,比如查找当前目录下最多两层目录下的所有文件

 

find  . -maxdepth 2 -type f

 

4)有时候,查找出文件来,还需要针对这些文件做一些操作,比如备份所有.conf文件

 

find . -type f -name "*.conf" --exec cp {} {}.bak ;

 

这个--exec选项类似于一个循环,循环对象就是前面的find出来的*.conf,每次循环,对象用{}代替,最后面的; 需要使用脱义,目的就是为了实现循环。

除了 --exec之外,还可以使用xargs实现,比如:

 

find . -type f -name "*.conf"  |xargs -i cp {} {}.bak

 

xargs 的-i选项,是为了遍历循环,它同样使用 {}来代替循环对象,有时候,xargs可以不加-i,比如:

 

find  . -name "*.txt"  |xargs rm

 

这是因为rm支持批量操作,比如  rm   1.txt  2.txt  3.txt ,而 mv 不支持,只能一个一个来。

再来看脚本需求,如何找到60天以前的,使用-mtime +60,除了mtime外,还有ctime和atime。我们先来看看mtime、ctime、atime是什么意思 ?

磁盘

大家看上下两次结果对比,上面是中文,下面是英文,最近访问时间 就是atime,最近更改时间就是mtime,指的是更改了文件内容,最近改动时间就是ctime,指的是更改了文件属性。

啥是文件属性呢,就是文件的大小啊、权限啊等信息。比如改了文件的读写执行权限,那么ctime会改,再比如改了文件的所有者,ctime也会变。这里有一个规律,那就是改了文件内容,mtime一定会变,从而ctime也一定会变。但反过来,你改了ctime,并不一定会改mtime。

找到60天以前的文件,指的是要找到mtime为60天以前的文件,find 就这样用    

 

find  -mtime +60 

 

+60表示60天以前, 而-60则表示60天以内。同理,找到一天以前的,那就是find  -mtime +1。

根据脚本需求,还需要找到1天以前的日志进行压缩,要注意的是,我们不能先找到1天以前的进行压缩,然后再去删除60天以前的,这个顺序不合适。因为你一旦gzip压缩了,之前的 *.log文件就没有了,你再这样"find  -type f -name "*.log"  -mtime +60"就找不到文件啦!

这里还有一个知识点需要给大家说一下,就是gzip压缩后,源文件没有了,生成了.gz文件,这个.gz的文件mtime跟源文件一样,大家看一下

磁盘

但是ctime会变,这是因为文件大小变啦。

最终的脚本是这样的:

 

#!/bin/bash
find /data/logs/ -name "*.log" -mtime +60 |xargs rm
find /data/logs/ -name "*.log"  -mtime +1 |xargs gzip

 

原来,竟如此简单!

  审核编辑:汤梓红
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分