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\n" else echo -e "find flie \n" 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 \n" #保留文件的个数
((restfile=$n-$nn)) if (("$restfile" < 10));then #由新到旧排序 #ls -lt echo -e "resrtfile count < 10 is $restfile \n" #由旧到新排序 ls -tr ./log/$log |grep -E -e "*.log" -e "*.txt" > /root/filecount.txt #保留最新的10个,其余的删除 echo -e "delfile filename is \n" 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\n" 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