一.背景
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