定期清空日志文件,不删除文件

放肆的年华 提交于 2020-03-17 08:03:42

一.背景

Linux服务器上,程序运行一段时间后,日志可能占满了磁盘,导致磁盘可用空间告警,这时就需要批量清空(非删除)日志文件

二.错误做法


一般可能会写个批量删除的脚本,定时去运行,形如:

#!/bin/bash
# 查看/opt目录下,所有日志文件及大小
find /opt -name *.log | xargs du -sh
# 删除/opt目录下所有的日志文件
find /opt -name *.log | xargs rm -rf

上面的命令可以完成删除的效果,但会引入一些问题,因为日志文件可能此时正在被程序使用,直接删除后,导致程序日志无法写入(删除后无法自动创建),必须重启服务后才能自动创建日志文件并再次写入。

这也正是我们查看日志时提示日志文件不存在,但系统进程存在而且系统可正常使用的原因所在。

三.正确做法

正确的做法是: 
1. 删除非当天的日志文件;(一般程序日志会配置日切,每日一个文件) 
2. 清空当天的日志文件;

#!/bin/bash
# 查看/opt目录下,所有【非当天】的日志文件及大小
find /opt -name *.log.* | xargs du -sh
# 删除/opt目录下所有【非当天】的日志文件
find /opt -name *.log.* | xargs rm -rf
# 查看/opt目录下,所有【当天】日志文件及大小
find /opt -name *.log | xargs du -sh
# 清空/opt目录下所有【当天】的日志文件
for i in `find /opt -name *.log`
do 
  cat /dev/null > $i
done

三、改造后的脚本

#!/bin/bash
#日志目录
APP_LOG_DIR="/opt/xxx/logs";
cleanAppLogFile(){
	for i in `find ${APP_LOG_DIR} -name "*.log"`
	do 
	  cat /dev/null > $i
	done
}
echo
cleanAppLogFile $APP_LOG_DIR

四、linux 定时任务配置

添加定时任务 : crontab -e

基本格式 : 
*  *  *  *  *  command 
分  时  日  月  周  命令 
解 释: 
第1列表示分钟1~59 每分钟用或者 /1表示 
第2列表示小时1~23(0表示0点) 
第3列表示日期1~31 
第4列表示月份1~12 
第5列标识号星期0~6(0表示星期天) 
第6列要运行的命令

例如:

linux 让 crontab 每天03点00 访问一次指定的url

 00 03 * * * /usr/bin/curl http://www.baidu.com/

注意:一定要加上这个 /usr/bin/curl

实际的配置

 00 03 * * * /usr/bin/sh /home/xx/cleanLog.sh

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!