Linux自動備份腳本--解析

      由於上次做項目的時候,客戶要求需要對系統狀態做自動備份,當時覺得自己寫得腳本實在是不夠上檔次,就開始在網上搜索各種比較好的腳本,現在找到了一個還挺不錯的腳本,與大家一起來解析分享一下。其實我第一遍看的時候中間有一小部分沒有弄懂,覺得裏面的語法真的是用的恰到好處,不過還是稍稍修改了一點。

#說明使用的是bash語法來寫腳本
#!/bin/bash
#設置日誌文件,前提建好了/backup/log目錄
LogFile=/backup/log/`date +"%Y-%m"`.log
#備份源目錄,這時我們可以寫成是“根目錄”,因爲系統狀態一定是保存在根目錄下的。
#從網上查資料得知,一般備份系統狀態都會備份/etc,/var,/root,/home,/opt,其他的目錄都是與系統狀態不大重要的
SourceDir=/
#備份目標
BakDir=/backup
#保存20天過期自動刪除
RetainDay=20
#備份的內容可以寫進project.lst,project.lst填寫備份目錄,下面是備份的
#具體腳本,其核心是tar打包,並把重要的內容記錄到日誌文件裏
ProjectLst=/backup/project.lst
##################################################
DATE=`date +"%Y-%m-%d"`
echo "backup start at $(date +"%Y-%m-%d %H:%M:%S")" >$LogFile
echo "--------------------------------------------------" >>$LogFile
cd $BakDir
PROJECTLIST=`cat $ProjectLst`
#這個Project是個新變量,進入循環,依次爲project中的目錄,etc,var,home,root,opt
for Project in $PROJECTLIST    
do
 ProjectData=$SourceDir/$Project
 DestDir=$BakDir/$Project
 PackFile=$DATE.$Project.tgz
 if [ -f $BakDir/$PackFile ]
 then
  echo "backup file have exist !" >>$LogFile
  else
  cp -af $ProjectData $DestDir >/dev/null
  tar -zcvf $PackFile $Project >/dev/null
  echo "backup $Project done into $PackFile" >>$LogFile
  rm -rf $Project
 fi
done
echo "--------------------------------------------------" >>$LogFile
echo "backup end at $(date +"%Y-%m-%d %H:%M:%S")" >>$LogFile
echo " " >> $LogFile
##################################################
#下面的內容就是把剛纔備份的內容傳到服務器上,前提是你有一個可以訪問到底FTP服務器
#put backup to ftp server
HOST=192.168.110.111
FTP_USERNAME=ftpuser
FTP_PASSWORD=123456
cd  $BakDir
echo "start open ftp serverat $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
echo "--------------------------------------------------" >>$LogFile
/usr/bin/ftp -in <<EOF
open $HOST
user $FTP_USERNAME $FTP_PASSWORD
put $DATE.$Project.tgz
bye
EOF
echo "put ftp end at $(date +"%Y-%m-%d %H:%M:%S")" >>$LogFile
#最後上傳完畢後再查看本地備份大於20天的自動刪除,這樣就可以實現本地異地雙備份
find $Bakdir -type f -mtime +$RetainDay -name "*.$Project.tgz" -exec rm {} \; >/dev/null
exit 0
#最後我們還可用crontab做個週期性計劃,比如每天一次全備份
#59 23 * *  *  /scripts/backup.sh



此處解釋兩個語法性的問題:

1.關於if [-f $1]

            do 

              command

            done

if 後接測試語句,[]中相當於test命令,-f 是檢測後面所跟的變量是否存在

上面語句意爲,如果在backup目錄中,已經存在備份過的目錄,就提示該目錄已存在,就不會再備份。 


2.find命令 

-exec rm {} \;這是一種格式,方便find查找,-exec後跟要執行的命令,一對大括號,斜槓和分號
-mtime   是按照文件的更改時間來查找文件,
            例如,find -mtime +n表示文件的更改時間距現在n天以前
                                      -n 表示文件的更改時間距現在n天以內
-type   是查找某一類型的文件  f --普通文件  p--管道文件 
                l--鏈接文件   d --目錄
                b--塊設備文件 c--字符設備文件
這句命令的意思是將備份大於20天的自動刪除
 


3./dev/null

  功能類似於回收站之類的目錄,將命令產生的郵件信息放進去,不然各種信息會撐爆系統的,它會自動清除

 



以下是我操作自動備份的命令:

[root@ZZSRV1 ~]# mkdir /scripts/
[root@ZZSRV1 ~]# cd /scripts/
[root@ZZSRV1 scripts]# ls
backup.sh
[root@ZZSRV1 scripts]# vi backup.sh
[root@ZZSRV1 scripts]# cat backup.sh
[root@ZZSRV1 scripts]# mkdir /backup
[root@ZZSRV1 scripts]# cd /backup
[root@ZZSRV1 backup]# touch project.lst
[root@ZZSRV1 backup]# vi project.lst
[root@ZZSRV1 backup]# cat project.lst
etc
var
home
root
opt
[root@ZZSRV1 backup]# mkdir log
[root@ZZSRV1 backup]# cd /scripts/
[root@ZZSRV1 scripts]# ls
backup.sh
[root@ZZSRV1 scripts]# sh backup.sh
[root@ZZSRV1 scripts]# cd /backup
[root@ZZSRV1 backup]# ll
total 34672
-rw-r--r-- 1 root root  6675038 Aug 20 14:19 2014-08-20.etc.tgz
-rw-r--r-- 1 root root      504 Aug 20 14:19 2014-08-20.home.tgz
-rw-r--r-- 1 root root      130 Aug 20 14:19 2014-08-20.opt.tgz
-rw-r--r-- 1 root root     2367 Aug 20 14:19 2014-08-20.root.tgz
-rw-r--r-- 1 root root 28809044 Aug 20 14:19 2014-08-20.var.tgz
drwxr-xr-x 2 root root       24 Aug 20 14:19 log
-rw-r--r-- 1 root root       23 Aug 20 14:25 project.lst
[root@ZZSRV1 log]# cat 2014-08.log
backup start at 2014-08-20 14:26:34
--------------------------------------------------
backup etc done into 2014-08-20.etc.tgz
backup home done into 2014-08-20.home.tgz
backup opt done into 2014-08-20.opt.tgz
backup root done into 2014-08-20.root.tgz
backup var done into 2014-08-20.var.tgz
[root@ZZSRV1 scripts]# crontab -e
59 23 * * * /scripts/backup.sh

 

   由上可以證明這個備份腳本是正確的,不會有任何問題,大家也可以提出自己的建議給我,一起進步!







  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章