一、腳本作用,每天打包郵件,并上傳到其他服務器,上傳后用md5檢驗是否完整,如不完整重新上傳
二、存在的問題:如首次上傳檔案不完整后md5能檢查出來并且,再次上傳,第二次檢查md5就變為正常了,但是實際傳過去還是不完整,手工獲取遠端md5也是那個不正常的,但是腳本獲取的就正常
三、代碼如下
a=`date +%Y%m%d` #日期資料
b=${a}_TXKJMAIL.sql #sql名字
IPX=192.168.96.159
IPX2=192.168.96.246
export i=`date -d "2 day ago" +"%Y%m%d"`
#校驗內網服務器連通性
ping -c 8 -w 20 192.168.96.159
if [[ "$?" -eq "0" ]] ;then
echo `date "+%Y-%m-%d %T"` "192.168.96.159服務器,連接正常" >> /usr/local/logs/${a}.log;
else
echo `date "+%Y-%m-%d %T"` "192.168.96.159服務器連接例外,腳本提前終止" >> /usr/local/logs/${a}.log;
exit;
fi
ping -c 8 -w 20 192.168.96.246
if [[ "$?" -eq "0" ]] ;then
echo `date "+%Y-%m-%d %T"` "192.168.96.246服務器,連接正常" >> /usr/local/logs/${a}.log;
else
echo `date "+%Y-%m-%d %T"` "192.168.96.246服務器連接例外,腳本提前終止" >> /usr/local/logs/${a}.log;
exit;
fi
#停服
echo `date "+%Y-%m-%d %T"` "正在停止服務" >> /usr/local/logs/${a}.log;
service httpd stop
systemctl stop postfix dovecot
#資料庫備份
echo `date "+%Y-%m-%d %T"` "正在備份資料庫" >> /usr/local/logs/${a}.log;
mysqldump -uroot -p"NL0fcstsrJt7ApoX" --databases ewomail > /ewomail/mail/$b
#打包
echo `date "+%Y-%m-%d %T"` "正在打包檔案" >> /usr/local/logs/${a}.log;
tar -czvf /usr/local/TXKJMAIL_$a.tar.gz /ewomail/mail
#洗掉sql備份的陳述句
echo `date "+%Y-%m-%d %T"` "洗掉sql陳述句" >> /usr/local/logs/${a}.log;
rm -rf /ewomail/mail/$b
#起服
systemctl start postfix dovecot
service httpd start
echo `date "+%Y-%m-%d %T"` "啟動郵箱服務" >> /usr/local/logs/${a}.log;
#遠程傳送打包好的檔案
#本程式遠程傳輸使用了rsync工具,使用它的前提是 雙方pc上都要事先安裝rsync工具,另外接收檔案的一方必須要免密(否則rsync要互動密碼會失敗)
echo `date "+%Y-%m-%d %T"` "開始遠程傳送檔案" >> /usr/local/logs/${a}.log;
rsync -P --rsh=ssh /usr/local/TXKJMAIL_$a.tar.gz [email protected]:/home/backup/bakmail/txkj
rsync -P --rsh=ssh /usr/local/TXKJMAIL_$a.tar.gz [email protected]:/home/data_bak/bakmail/txkj
echo `date "+%Y-%m-%d %T"` "檔案傳送完成" >> /usr/local/logs/${a}.log;
sleep 60 #等待60秒
#MD5檔案對比,并且如MD5值不相同,將重新傳輸5次
g=1 #回圈計數器
while [ true ] #這樣寫相當于無限回圈,如何退出由if控制
do
export c=`md5sum /usr/local/TXKJMAIL_$a.tar.gz | awk '{print $1}'`
export d=`ssh ${IPX} md5sum /home/backup/bakmail/txkj/TXKJMAIL_$a.tar.gz | awk '{print $1}'`
echo "159本地MD5:${c}" >> /usr/local/logs/${a}.log;
echo "159遠端MD5:${d}" >> /usr/local/logs/${a}.log;
if [[ "$c" = "$d" ]] ;then
echo `date "+%Y-%m-%d %T"` "159服務器上的檔案MD5校驗正常" >> /usr/local/logs/${a}.log;
break
elif [ "$g" = 5 ] ;then
echo -e "\033[41;37m `date "+%Y-%m-%d %T"` 159服務器上的檔案已經嘗試傳輸${g}次仍然不成功,請手工處理該問題 \033[0m" >> /usr/local/logs/${a}.log;
break
else
echo -e "\033[41;37m `date "+%Y-%m-%d %T"` 159服務器上的檔案MD5校驗不正常重傳第${g}次 \033[0m" >> /usr/local/logs/${a}.log;
rsync -P --rsh=ssh /usr/local/TXKJMAIL_$a.tar.gz [email protected]:/home/backup/bakmail/txkj
g=$(($g+1)) #回圈計數器+1
fi
done
h=1 #回圈計數器
while [ true ] #這樣寫相當于無限回圈,如何退出由if控制
do
export e=`md5sum /usr/local/TXKJMAIL_$a.tar.gz | awk '{print $1}'`
export f=`ssh ${IPX2} md5sum /home/data_bak/bakmail/txkj/TXKJMAIL_$a.tar.gz | awk '{print $1}'`
echo "246本地MD5:${e}" >> /usr/local/logs/${a}.log;
echo "246遠端MD5:${f}" >> /usr/local/logs/${a}.log;
if [[ "$e" = "$f" ]] ;then
echo `date "+%Y-%m-%d %T"` "246服務器上的檔案MD5校驗正常" >> /usr/local/logs/${a}.log;
break
elif [ "$h" = 5 ] ;then
echo -e "\033[41;37m `date "+%Y-%m-%d %T"` 246服務器上的檔案已經嘗試傳輸${h}次仍然不成功,請手工處理該問題 \033[0m" >> /usr/local/logs/${a}.log;
break
else
echo -e "\033[41;37m `date "+%Y-%m-%d %T"` 246服務器上的檔案MD5校驗不正常重傳第${h}次 \033[0m" >> /usr/local/logs/${a}.log;
rsync -P --rsh=ssh /usr/local/TXKJMAIL_$a.tar.gz [email protected]:/home/data_bak/bakmail/txkj
h=$(($h+1)) #回圈計數器+1
fi
done
#chmod -R 755 /usr/local/
cd /usr/local/
/bin/find /usr/local/ -name TXKJMAIL_${i}.tar.gz -type f -exec rm {} \;
echo `date "+%Y-%m-%d %T"` "正在洗掉${i}.tar.gz" >> /usr/local/logs/${a}.log;
rsync -P --rsh=ssh /usr/local/logs/${a}.log [email protected]:/home/backup/bakmail/txkj/logs
rsync -P --rsh=ssh /usr/local/logs/${a}.log [email protected]:/home/data_bak/bakmail/txkj/logs
四、下面是運行后的截圖

五、這是實際上246服務器上就收到的檔案(正常應該是1.5g,實際才接到了900M)
uj5u.com熱心網友回復:
我自己解決了因為rsync傳輸失敗的行程,不會因為失敗立即關閉,當腳本結束后把正常的包又覆寫了轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/53827.html
標籤:系統維護與使用區
