1. 程式人生 > >shell腳本----周期壓縮備份日誌文件

shell腳本----周期壓縮備份日誌文件

echo 功能 初始 今天 let back 周幾 key example

一、日誌文件樣式


技術分享

二、目標


1、備份壓縮.log結尾&&時間樣式為“date +%Y%m%d”的日誌文件(如:20170912、20160311等)

2、可指定壓縮範圍(N天前至當天):如:今天、昨天(date -d "-1 day" +%Y%m%d)至今天、前天至今天

壓縮命名格式為:日期.tar.gz(或:日期.tar.bz2),壓縮N天範圍內文件後將會生成N個壓縮包

3、可指定壓縮模式(二選一):tar czf 或 tar cjf

4、可指定刪除範圍:刪除N天前的日誌文件,如:今天為20170912,刪除3天前日誌,即刪除20170908及其以前的日誌文件

5、每周五(不一定周五,可在腳本中指定周幾打包)將壓縮文件打包(打包成功後刪除壓縮文件),並上傳到日誌服務器,上傳成功後刪除打包文件

6、默認備份當天日誌文件,壓縮模式為“czf”,刪除三天前日誌文件

三、腳本內容


技術分享
#!/bin/bash
#author:xiami
#date:20170907
#description: compress files of a specified mode and delete logs before a particular date
#version:v0.1

strategy_logs_path="
/root/apps/myapp/log" date=$(date +%Y%m%d) #------------初始化函數默認參數---------- init_argv(){ #example:init_argv -d 4 -m cjf -r 5 打包壓縮近四天及當天日誌,壓縮模式cjf,刪除五天前日誌 compress_date=$(date +%Y%m%d) backup_mode="czf" del_days_num=3 backup_path="/root/apps/logs_backup" line=$(ps -ef |grep "
ssh-agent"|awk {if($0!~/grep ssh-agent/)print $0}|wc -l) while getopts d:m:r: opt do case $opt in d) compress_days="$OPTARG" ;; m) backup_mode="$OPTARG" ;; r) del_days_num="$OPTARG" ;; \?) echo "Usage: `basename $0` [d|m|r]" echo "-d ‘Integer‘ (tar & compress Integer day logfile)" echo "-m ‘czf|cjf‘ (mode)" echo "-r ‘Interger‘ (remove files Integer days ago)" exit 1 ;; esac done if [ ! -d "$backup_path" ];then mkdir -p $backup_path fi # if [ line -lt 1 ];then # echo "Not running ssh-agent" # exit 1 # fi } #------------打包並壓縮日誌文件操作函數-------------------- tar_compress_log(){ #參數1:壓縮日期 參數2:壓縮備份模式 local compress_date="$1" local backup_mode="$2" cd "$strategy_logs_path" # ls . -name "*$date*.log"|xargs tar $backup_mode "$date.tar.gz" #壓縮當天日誌 if [ "$backup_mode" == czf ];then ls | grep ".*[0-9]\{8\}.*\.log$"|grep ".*"$compress_date".*"|xargs tar $backup_mode "$backup_path/"$1".tar.gz" elif [ "$backup_mode" == cjf ];then ls | grep ".*[0-9]\{8\}.*\.log$"|grep ".*"$compress_date".*"|xargs tar $backup_mode "$backup_path/"$1".tar.bz2" else echo "tar mode error";exit 2 fi } #------------打包並壓縮N天前到當前日期範圍的日誌文件---------- compress_range_date(){ #參數1:壓縮備份天數 參數2:壓縮備份模式 local dates="$date" local compress_days="$1" local backup_mode="$2" if [[ ! -z "$compress_days" && "$compress_days" -ne 0 ]];then for i in `seq 1 "$compress_days"`;do dates=$(date -d "-$i day" +%Y%m%d) # n=$(echo $dates|awk {print NF}) tar_compress_log "$dates" "$backup_mode" done else tar_compress_log "$dates" "$backup_mode" fi } #------------每周五打包當周壓縮文件並在打包成功後刪除單個壓縮文件------------ tar_file(){ weekday=$(date +%u) if [ "$weekday" -eq 5 ];then cd "$backup_path" ls|xargs tar cf "$date-Fri-logs.tar" && rm *.tar.?z* fi } #-----------刪除(del_log_days)天前日誌文件(根據mtime)--------- delete_days_log1(){ #參數1:del_days_num local del_days_num="$1" cd "$strategy_logs_path" find . -type f -mtime +$del_days_num |grep ".*[0-9]\{8\}.*\.log"|xargs rm aa -rf #刪除操作,請謹慎 } #----------刪除(del_log_days)天前日誌文件(根據log文件名)---- delete_days_log2(){ #參數1:del_days_num local del_days_num="$1" cd "$strategy_logs_path" local num=$(ls |grep ".*[0-9]\{8\}.*\.log$" |grep -o "[0-9]\{8\}"|awk !day[$0]++|wc -l) local files=$(ls |grep ".*[0-9]\{8\}.*\.log$" |grep -o "[0-9]\{8\}"|awk !day[$0]++) if [ ! -z "$num" ];then local field="" for i in `seq 1 "$num"` do field=$(echo $files|awk {print $v} v=$i) if [ "$field" -lt $(date -d "-$del_days_num day" +%Y%m%d) ];then ls *$field* |grep .*[0-9]\{8\}.*\.log$|xargs rm aa -rf fi done fi } #-----------上傳到日誌服務器------------- upload_tgz(){ scp $backup_path/$date.tar.gz 192.168.119.133:/opt/ && rm $backup_path/$date.tar.gz #scp $backup_path/$date*-logs.tar 192.168.119.133:/opt/ && rm $backup_path/$date*-logs.tar } #-----------main------------------------- main(){ init_argv $argv compress_range_date "$compress_days" "$backup_mode" delete_days_log2 $del_days_num tar_file # upload_tgz } #----------執行部分---------------------- argv="" until [ "$#" -eq 0 ];do argv="$argv $1" shift done main $argv
log_tar_clean.sh

四、運行腳本


日誌文件初始數量為圖一所示

4.1 帶參數運行後

技術分享

技術分享

技術分享

技術分享

4.2 不帶參數運行(默認情況,備份當天日誌文件,壓縮模式為“czf”,刪除三天前日誌文件)

為了使測試環境一致,首先恢復被刪除日誌文件,刪除壓縮文件

技術分享

不帶參數運行腳本

技術分享

技術分享

技術分享

五、計劃任務



基本功能已實現,但腳本還有待改進,例如腳本中使用的grep可以換成egrep,可以少一層轉義。

上傳備份功能還未進行測試,可能會出現錯誤,當然,上傳前肯定得先將本地公鑰放入服務器的authorized_keys文件中,實現ssh無密登陸。

最後想感慨一句,還是python更強大

good good study,day day up

shell腳本----周期壓縮備份日誌文件