Linux上有很多日誌檔案,通常會依照日期一天產生一個log檔案,時間久了會越來越佔空間。你可能只想保留3天內的、5日內的、一週內的,或是30天一個月內的日誌檔案。本篇文章教學如何寫一個Shell Script定期清理日誌檔,透過Shell Script搭配Crontab自動執行,要把日誌檔刪除或是移到別的硬碟、別的網路硬碟備份都可以。
自動化腳本
程式腳本
首先建立一個Shell Script,例如我放在/klab.tw/auto-rm.sh
。
#!/bin/bash
# 要刪除的LOG的資料夾
dir="/klab.tw/log/dir/path"
# 要保留幾天內的檔案
day=5
# 獲得當下的時間(Unix timestamp)
current_time=$(date +%s)
# 計算要被刪除的時間(Unix timestamp),檔案的最後修改日期低於這個時間就會被刪除
time_threshold=$((current_time - ${day} * 24 * 60 * 60))
# 走訪指定資料夾內所有「.log」結尾的檔案,對檔名有特別需求可以自行修改
for file in $dir/*.log; do
# 檔案的最後修改日期
modification_time=$(stat -c %Y "$file")
if [ $modification_time -lt $time_threshold ]; then
echo "Delete file: $file"
# 取消下面這行的註解就會真的刪除資料,請小心使用
# rm -f $file
# 或是你可以把它移動到另一個資料夾備份 or 人工確認後再刪除
# mv $file "/your/new/path"
fi
done
基本上你可以直接複製貼上來使用,只需要修改三個地方。
第一個是dir
設定,看你的log檔案在哪邊就填上去即可。
第二個是day
設定,例如你想保留30天內的log檔案,就填上30。
到這一步rm
與mv
指令都還被註解著,你可以先執行看看這個腳本,使用sh /klab.tw/auto-rm.sh
就會顯示出哪些檔案會被刪除。
最後要修改的地方是在腳本下方選擇你要刪除太久的log檔案,或是把它移動走。要刪除的話取消註解rm -f $file
就可以了,要小心使用弄錯了沒人會負責喔!因此你可以警慎一點直接把第21行刪掉永遠不要使用,改用mv $file "/your/new/path"
,讓腳本將過期的檔案搬到你喜歡的地方,可以是一個專門備份日誌用的雲端硬碟,或是一個等待刪除的暫存資料夾,等你挑一個良辰吉日再手動刪除他。
定期執行
使用Linux上的crontab來每天定時執行,關於crontab的介紹可以觀看我的另一篇文章 每天定時自動備份Docker內的MySQL、MariaDB與MongoDB 裡面也有提及。
我們要創一個cron的設定檔案,放在/etc/cron.d/
裡面,例如我們創建一個檔案叫/etc/cron.d/auto-rm
,並且輸入以下內容。
# 分 時 日 月 星期 執行帳號 指令...
0 3 * * * root sh /klab.tw/auto-rm.sh
這個設定的意思是每天凌晨三點,使用root帳號執行指令sh /klab.tw/auto-rm.sh
,到此為止就設定完成囉。