一、公司提供的參考指令碼:
#!/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
透過以上步驟,您可以設定一個定時任務來定期執行您的日誌清理指令碼。