场景:每天定时清理linux服务器上tomcat的日志,如果catalina.out控制台日志大于300多M则分割,然后根据mtime来筛选文件,清理3个月前的文件。
find和-mtime的配合使用:
find ./ -name “*data*” -mtime +1 当前目录下文件名包含data,而且修改时间在48小时以上的
find ./ -name “*date*” -mtime +2 当前目录下文件名包含data,而且修改时间在72小时以上的
find ./name “*data*” -mtime -1 当前目录下文件名包含data,而且修改时间在24小时以内的
find ./name “*data*” -mtime -2 当前目录下文件名包含data,而且修改时间在48小时以内的
find ./name “*data*” -mtime 1 当前目录下文件名包含data,而且修改时间在1天前当天的,也就是24小时以上,48小时以内
脚本如下,清理/home/wjz/dirs目录下,30天以上的文件
#!/bin/bash
echo 'log cleaning begin : '`date +%F_%T`
find /home/wjz/dirs -mtime +30 -name 'jboss.log.2*' -exec rm -rf {} \;
echo 'log cleaning end : '`date +%F_%T`
ctime---change time,改变文件用户、权限等属性的时间
mtime ---modify time,改变文件内容的时间
atime --- access time ,访问文件的时间
最终脚本:
#!/bin/bash
#clear log
echo "----------$(date "+%Y-%m-%d %H:%M:%S")-----------"
log_dir=/wls/tomcat/apache-tomcat-8.5.55/logs
monitor_file=catalina.out
cd $log_dir
file_size=`du $log_dir/$monitor_file | awk '{print $1}'`
echo "文件大小" $file_size
if [ $file_size -ge 350000 ]
then
cp $monitor_file $log_dir/$monitor_file-`date +%Y-%m-%d_%H:%M:%S`.log
echo `date +%Y-%m-%d-%H:%M:%S`":文件切割"
echo "" > $monitor_file
else
echo "无需分割文件"
fi
echo "清理3个月前文件"
FILES=`find $log_dir -mtime +90|xargs -l`
for FILENAME in $FILES
do
if [ -f "$FILENAME" ]
then
echo $FILENAME
rm $FILENAME
fi
done
通过crontab设置
30 22 * * * /wls/tomcat/apache-tomcat-8.5.55/clear_log.sh >> /wls/tomcat/apache-tomcat-8.5.55/clear_log.log
有关crontab的时间设置详见这篇文章: