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