#!/bin/bash #本腳本是用來計算本地磁盤空間大小,而且與svn備份文件大小進行比較判斷,當知足什麼條件時,作出相應的響應。 #第一步是檢測svn服務器,svn數據文件的總量大小和本機磁盤剩餘空間的大小。 ##鏈接10.68.3.152服務器,查看最新svn文件大小,獲取查看的值。 datef() { date "+%Y/%m/%d %H:%M" } password=xxxx2015 svnreport=/data/log/report_`date "+%Y%m%d"`.log if [[ ! -f $svnreport ]];then touch $svnreport fi echo "[$(datef)] 開始鏈接3.152服務器,查詢svn大小" >> $svnreport #查詢svn文件大小 connect152() { expect -c " set timeout 30 spawn ssh root@192.168.3.152 expect \"root@192\.168\.3\.152's password:\" send \"$password\r\" expect \"*# \" send \"cat \/data\/log\/report152.log\r\" expect \"eof\" " } echo "[$(datef)] 開始鏈接3.65服務器,查詢svn大小" >> $svnreport connect65() { expect -c " set timeout 30 spawn ssh root@192.168.3.65 expect \"root@192\.168\.3\.65's password:\" send \"$password\r\" expect \"*# \" send \"cat \/data\/log\/report65.log\r\" expect \"eof\" " } #將查詢的函數賦給變量,便於取值。 result152=$(connect152) result65=$(connect65) #過濾出咱們須要的數值,也就是查詢後的svn文件大小 echo "$result152 " |grep "/var/svn" | grep -v "#" | awk '{print $1}' >/dev/null value152=`echo "$result152 " |grep "/var/svn" |grep -v "#" |awk '{print $1}'` echo "[$(datef)] '152上svn文件大小='$value152 ">> $svnreport echo "$result65 " |grep "/data/svn" | grep -v "#" | awk '{print $1}' >/dev/null value65=`echo "$result65 " |grep "/data/svn" |grep -v "#" |awk '{print $1}'` echo "[$(datef)] '65上svn文件大小='$value65 ">> $svnreport #計算兩臺服務器上的svn文件大小總和 ((value=$value152+$value65)) echo "[$(datef)] '兩臺svn,總文件大小='$value ">> $svnreport #查詢本地剩餘磁盤空間,默認svn備份時在/svnbackup目錄下,該目錄有500G的空間。 value248=`df /svnbackup | awk '{print $4}'| grep -v "Available"` echo "[$(datef)] '本機剩餘磁盤空間大小='$value248 ">> $svnreport #判斷比較,若是本地磁盤空間大於svn的文件,那麼正常備份,不然發送郵件給管理員發出警告。 if [[ $value -lt $value248 ]] then echo '開始執行3.65異地備份回滾動做'>>$svnreport sh /data/scripts/auto_scp65.sh sleep 4h echo '開始執行3.152異地備份回滾動做'>>$svnreport sh /data/scripts/auto_scp152.sh else #這裏作減法運算,最先svn保留8天的備份,當svn文件逐步增大後,就相應減小svn備份。 #經過查詢/data/log/num,該文件記錄svn備份保留天數。 NUM=`cat /data/log/num` #適當減小svn備份保留的次數 NUM=$(expr $NUM - 1 ) #將保留的值,存放起來,以便之後再次判斷。 echo "$NUM" > /data/log/num echo "[$(datef)] 'NUM-1='$NUM ">> $svnreport fewdaysago=`date -d "$NUM day ago" +%Y%m%d` echo "[$(datef)] 'fewdaysago='$fewdaysago" >> $svnreport #刪除svn152備份 cd /svnbackup/backup152 if [[ -d $fewdaysago ]] then rm -rf $fewdaysago else echo "[$(datef)] $fewdaysago not exist in /svnbackup/backup152/ " >> $svnreport 2>&1 fi #刪除svn65備份 cd /svnbackup/backup65 if [[ -d $fewdaysago ]] then rm -rf $fewdaysago else echo "[$(datef)] $fewdaysago not exist in /svnbackup/backup65/ " >> $svnreport 2>&1 fi #在備份最新的svn數據 echo "[$(datef)] 備份最新的" >> $svnreport fi #判斷NUM的值,當NUM的值不大於5的時候就發郵件給管理員。 #這裏郵件採用的是mutt+msmtp 編輯發送。 #注:我這裏測試郵件發送功能時,選擇當num值不小於5時,就發送 NUM=`cat /data/log/num` echo "[$(datef)] 'NUM='$NUM ">> $svnreport if [[ $NUM -ge 5 ]] then echo "[$(datef)] 即將發送郵件給管理員">> $svnreport cat /data/log/report_`date "+%Y%m%d"`.log | mutt -s "warnning svn backup" 1557882533@qq.com fi
本例中,因爲只須要向管理員發送報警郵件,而不須要郵件回覆,所以就採用了mutt+msmtp 來實現這一功能。下面介紹如何配置。c++
#安裝前,請確保服務器已安裝以下包 yum install gcc gcc-c++ gnutls gnutls-devel gnutls-utils openssl openssl-devel libidn libidn-devel -y #mutt能夠用yum裝 yum -y install mutt* #從網上down下msmtp的tar包 wget http://down1.chinaunix.net/distfiles/msmtp-1.4.28.tar.bz2 #解壓tar包 tar -jxvf msmtp-1.4.28.tar.bz2 cd msmtp-1.4.28 ./configure --prefix=/usr/local/msmtp make && make install #建立msmtp的配置目錄 mkdir /usr/local/msmtp/etc #建立mail帳號文件 touch /usr/local/msmtp/etc/msmtprc # vim /usr/local/msmtp/etc/msmtprc defaults tls on #msmtp的日誌文件 logfile /usr/local/msmtp/msmtp.log #虛擬郵件帳號名稱acc2 account acc2 #經過qq郵箱,將郵件發送至管理員手中 host smtp.qq.com port 465 #表示郵件是從599080723@qq.com 這個郵箱帳號發送給管理員的帳號 from 599080723@qq.com auth login #qq郵箱不支持tls_starttls,所以須要關閉該選項。 tls_starttls off tls on tls_certcheck off #這裏記錄了599080723郵箱帳號的賬密信息 user 599080723@qq.com #這裏的密碼是明文, password xxxxxxxxx #你能夠配置多個虛擬郵箱帳號,以便發送給不用郵箱類型的用戶。 account default : acc2 接來下是配置mutt vim /etc/Muttrc #在文件的最後面,加入以下幾行。 #wangjl add new #設置執行mail發送的文件 set sendmail="/usr/local/msmtp/bin/msmtp" #是否設置郵件的發送人 set use_from=yes set realname="599080723@qq.com" set editor="vim" #郵件的編碼格式爲utf8,以前沒寫這個,結果發送給個人郵件都是亂碼。 set charset="utf8" #測試看是否能夠發送郵件 echo 「this is a test mail」 | mutt -s "title" 1557882533@qq.com #而後看1557882533的郵箱是否收到了測試郵件。 #若是測試成功的話,那麼咱們就能夠將svn備份等信息發送給管理員,以便其判斷svn是否備份回滾成功。 cat /data/log/report_`date "+%Y%m%d"`.log | mutt -s "warnning svn backup" 1557882533@qq.com
那麼至此,svn異地自動化備份和災後恢復以及mail報警就實現了。shell