Linux-通用性日誌切割指令碼

Linux运维技术栈發表於2024-08-29

一、公司提供的參考指令碼:

#!/bin/bash
# 定義需要清理的檔案
log_file=(
"/mpjava/ly.mp.dfpv.acc.biz/bin/nohup.out"
"/mpjava/ly.mp.dfpv.acc.service/bin/nohup.out"
)
# 獲取當天日期
date_now=$(date +%Y%m%d)

for file_dir in $log_file
do
   # 獲取檔案路徑
   dir=$(dirname $file_dir)
   # 獲取檔名
   file_name_new=$(basename $file_dir)
   # 建立備份目錄
   mkdir -p ${dir}/backup
   # 備份日誌
   cp ${file_dir} ${dir}/backup/${date_now}_${file_name_new}
   # 清空日誌
   echo "" > ${file_dir}
   # 刪除歷史
   cd ${dir}/backup/ &&  find . -type f -mtime +6 -exec rm -f {} \;
done

驗證結果:並未驗證成功

二、自己改進後指令碼:

#!/bin/bash

# 定義需要清理的檔案
log_file=(
    "/mpjava/ly.mp.dfpv.acc.biz/bin/nohup.out"
    "/mpjava/ly.mp.dfpv.acc.service/bin/nohup.out"
)

# 獲取當前日期和時間,用於備份檔名中包含時間戳
date_now=$(date +%Y%m%d_%H%M)

for file_dir in "${log_file[@]}"
do
    if [[ ! -f "$file_dir" ]]; then
        echo "Warning: File $file_dir does not exist, skipping."
        continue
    fi

    # 獲取檔案路徑和檔名
    dir=$(dirname "$file_dir")
    file_name_new=$(basename "$file_dir")

    # 建立備份目錄
    mkdir -p "${dir}/backup"

    # 備份日誌,新增時間戳避免覆蓋
    backup_file="${dir}/backup/${date_now}_${file_name_new}"
    cp "$file_dir" "$backup_file" && echo "Backup created: $backup_file" || echo "Error: Failed to backup $file_dir"

    # 清空日誌
    > "$file_dir" && echo "Log cleared: $file_dir" || echo "Error: Failed to clear log $file_dir"

    # 刪除超過7天的日誌
    find "${dir}/backup" -type f -mtime +6 -exec rm -f {} \; &>/dev/null
    if [[ $? -eq 0 ]]; then
        echo "Old logs removed from ${dir}/backup"
    else
        echo "Error occurred while removing old logs from ${dir}/backup"
    fi
done

指令碼執行過程:
執行指令碼前:

執行指令碼後:

結論:這個指令碼是通用性指令碼,nginx、各中介軟體、應用服務等日誌清理都可以使用,只需要修改log_file變數為自己環境具體路徑 和 日誌檔案即可

三、配置定時任務
1、開啟當前使用者的crontab檔案:
crontab -e

2、新增定時任務(每天凌晨1點執行):
0 1 * * * /path/to/your/Log_cutting.sh
這裡 /path/to/your/script.sh 應該替換為你的指令碼實際所在的路徑。

3、儲存並關閉crontab檔案:儲存更改並退出編輯器。在 vi 或 vim 中,你可以按 ESC 然後輸入 :wq 並按 Enter 儲存並退出。在 nano 中,你可以按 Ctrl+X,然後按 Y 確認儲存,最後按 Enter 退出。

4、確保指令碼具有執行許可權:
chmod +x /path/to/your/Log_cutting.sh

5、檢查cron服務狀態:
systemctl status cron
如果服務沒有執行,你可以使用以下命令啟動它:systemctl start cron

6、檢視cron日誌:
如果需要除錯定時任務,你可以檢視 /var/log/cron 日誌檔案來獲取 cron 的日誌資訊。

7、注意環境問題:
cron 定時任務執行在非登入shell環境中,這意味著它可能沒有訪問某些環境變數。如果依賴於特定的環境變數,需要在指令碼本身或在 crontab 檔案中設定這些變數。

例如,如果需要知道 PATH 環境變數,可以在 crontab 檔案中設定它,如下所示:

SHELL=/bin/bash
PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin
0 1 * * * /path/to/your/Log_cutting.sh

透過以上步驟,您可以設定一個定時任務來定期執行您的日誌清理指令碼。

相關文章