1. 程式人生 > >Linux上批量清空日誌檔案(非刪除)

Linux上批量清空日誌檔案(非刪除)

背景

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

如果不想寫個指令碼,直接執行命令則如下:

for i in `find /opt -name *.log`; do cat /dev/null > $i; done

相當於將指令碼中的for迴圈寫在一行上,直接在命令列中執行

誤區

刪除時可以使用下面的命令

find /opt -name *.log | xargs rm -rf

清空時,可能大家不想寫for迴圈,也想通過上面的形式去清空,但實際效果是沒有效果(具體原因沒有研究)

find /opt -name
*.log | xargs -I filename cat /dev/null > filename