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。

到這一步rmmv指令都還被註解著,你可以先執行看看這個腳本,使用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,到此為止就設定完成囉。