shell 删除日志

一般线上服务的日志都是采用回滚的防止,写一定数量的日志

或是有管理工具定期去转移老旧日志

前几天删除一个测试环境的日志,只保留两天的日志,结果把正在写的日志都给删掉了,不得不重启了服务,经过这一次的错误,积攒了一些删除日志的经验

1、不同服务的日志更新速度是不同的,有的日志一秒就会写一个规定大小的文件,有的服务日志可能会一个月也写不满一个文件,或者根本就不写文件,所以在删除日志的时候要考虑不同服务文件时要弄清一下几点:系统显示的时间是什么时间(创建时间,修改时间,访问时间),更新速度,后缀名,删除正在写的日志,会不会重写

2、log目录子目录中是否也有日志文件,避免勿删调其他的脚本文件或是其他

#!/bin/bash
for log in `ls ./log`
do
        case "$log" in
        "log1")
#文件个数小于10个不删除
        n=`ls -l ./log/$log |grep "^-"|wc -l`
        if (($n<10));then
                echo -e "file count < 10 ,don't del
"
        else
                echo -e "find flie 
"
                find ./log/$log/ -maxdepth 1 -mmin +2880 -type f -exec basename {} ; > /root/filecount.txt
                cat /root/filecount.txt
#要删除文件的个数
                nn=`cat /root/filecount.txt|wc -l`
                echo -e "fine count id $nn 
"
#保留文件的个数
((restfile
=$n-$nn)) if (("$restfile" < 10));then #由新到旧排序 #ls -lt echo -e "resrtfile count < 10 is $restfile " #由旧到新排序 ls -tr ./log/$log |grep -E -e "*.log" -e "*.txt" > /root/filecount.txt #保留最新的10个,其余的删除 echo -e "delfile filename is " cat /root/filecount.txt ((delfile=$n-10)) i=1 for filename in `cat /root/filecount.txt` do if (($i==$delfile));then echo -e "file counet is $delfile end del " exit 1 else echo "del file is the $i -- $filename " rm -rf ./log/$log/$filename fi ((i=$i+1)) done else echo "restfile >10 del all find" find ./log/$log/ -maxdepth 1 -mmin +2880 -type f -delete fi fi ;; esac done
原文地址:https://www.cnblogs.com/Pierre-de-Ronsard/p/3329809.html