由於上次做項目的時候,客戶要求需要對系統狀態做自動備份,當時覺得自己寫得腳本實在是不夠上檔次,就開始在網上搜索各種比較好的腳本,現在找到了一個還挺不錯的腳本,與大家一起來解析分享一下。其實我第一遍看的時候中間有一小部分沒有弄懂,覺得裏面的語法真的是用的恰到好處,不過還是稍稍修改了一點。
#說明使用的是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
由上可以證明這個備份腳本是正確的,不會有任何問題,大家也可以提出自己的建議給我,一起進步!