在爱立信实习Linux管理员也有一个月了。最近老大让我修改一个rsync自动备份的脚本。提出两个需求:第一,把不需要的文件过滤掉。第二,report的格式要好看一点。改好的脚本如下,分享一下:
#!/bin/bash set -x #Get hostname HOSTNAME=`hostname` #Check autofs availablity ls /net/150.236.72.6/vol/vol_ipos_etos17 if [ $? = 0 ] ; then echo AUTOFS GOOD on "$HOSTNAME" > /tmp/fasdkl921jkl.`date +%Y%m%d` else echo AUTOFS NOT Working on "$HOSTNAME" > /tmp/fasdkl921jkl.`date +%Y%m%d` fi #Create log file LOG=/net/150.236.72.6/vol/vol_ipos_etos17/scripts/LOG/"$HOSTNAME"_RSYNC`date +%Y%m%d%H%M`.log if [ ! -f $LOG ] ; then touch $LOG echo $LOG fi GENERAL_LOG=/net/150.236.72.6/vol/vol_ipos_etos17/scripts/LOG/general.log if [ ! -f $GENERAL_LOG ] ; then touch $GENERAL_LOG echo $GENERAL_LOG fi #if `hostname` DATA=`date +%Y%m%d` time rsync -avzpo --delete --exclude "sjenkins" --exclude "tof-projectDir*" --exclude "ersoam-projectDir*" --exclude "build-rp-wr*" /local/workspace/* /net/150.236.72.6/vol/vol_ipos_etos17/$HOSTNAME/ >> $LOG if [ $? = 0 ] ; then echo Backup of "$HOSTNAME" on "$DATA" success at_`date +%Y%m%d%H%M` start at__"$DATA" >> $GENERAL_LOG else echo Backup of "$HOSTNAME" on "$DATA" fail at_`date +%Y%m%d%H%M`start at__"$DATA" >> $GENERAL_LOG fi #Mail function COUNT_BACKUP=`more $GENERAL_LOG |grep $DATA |wc -l` if [ $COUNT_BACKUP -eq 9 ] then TODAY=`date +%Y-%m-%d` MAIL_LOG=`pwd`/$TODAY.html MAIL_FROM=ge.jiang@ericsson.com MAIL_TO=ge.jiang@ericsson.com cd /net/150.236.72.6/vol/vol_ipos_etos17/ used=`df -h .|grep %|grep -v Filesystem|awk '{print $4}'` if [ -f $MAIL_LOG ];then rm $MAIL_LOG touch $MAIL_LOG fi echo "From: ${MAIL_FROM}">>${MAIL_LOG} echo "To: ${MAIL_TO}">>${MAIL_LOG} echo "Content-type: text/html;charset=UTF-8 ">>${MAIL_LOG} echo "Subject:server backup report on ${TODAY} ">>${MAIL_LOG} echo "">>${MAIL_LOG} echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> Backup has been finished,and $used diskspace has been used. <br> <br />+++++++++++++++++++++ Backup Results on $TODAY +++++++++++++++++++++<br />">>${MAIL_LOG} echo "<table width=\'90%\' border=\'1\'>">>${MAIL_LOG} declare -a s declare -a t declare -a f declare -i l l=`more $GENERAL_LOG |grep $DATA|wc -l` s=`more $GENERAL_LOG |grep $DATA|awk '{print $3}'` t=`more $GENERAL_LOG |grep $DATA|awk '{print $7}'|awk -F "_" '{print $2}'|cut -c 7-` f=`more $GENERAL_LOG |grep $DATA|awk '{print $6}'` echo " <tr bgcolor=\'#EF9024\'> <td>Server name</td>">>${MAIL_LOG} for i in $s do echo "<td>$i</td>">>${MAIL_LOG} done echo "</tr>">>${MAIL_LOG} echo " <tr bgcolor=\'#EF9024\'> <td>Finish time</td>">>${MAIL_LOG} for i in $t do echo "<td>$i</td>">>${MAIL_LOG} done echo "</tr>">>${MAIL_LOG} echo " <tr bgcolor=\'#EF9024\'> <td>Finish status</td>">>${MAIL_LOG} for i in $f do echo "<td>$i</td>">>${MAIL_LOG} done echo "</tr>">>${MAIL_LOG} cat ${MAIL_LOG} | sendmail -t else echo Backup partially finished. fi
第一个需求,通过修改这条语句实现:
time rsync -avzpo --delete --exclude "sjenkins" --exclude "tof-projectDir*" --exclude "ersoam-projectDir*" --exclude "build-rp-wr*" /local/workspace/* /net/150.236.72.6/vol/vol_ipos_etos17/$HOSTNAME/ >> $LOG
--exclude 过滤掉不需要备份的文件,这里采用的是通配符的方法。有点偷懒。如果要过滤掉的文件较多的话,可以放到一个文件中,命令改成 --exclude-from=file-dir,更加详细的参考这边文章。
http://blog.csdn.net/leo_farari/article/details/7699339
第二个需求,我采用sendmail发送html邮件实现。主要是对general.log文件进行分析,把分析结果写进html,然后发送给老大。
让我更加熟悉了awk和cut等的使用。
sendmail功能通过语句
cat ${MAIL_LOG} | sendmail -t 实现。但是脚本要注意添加邮件头如下:
echo "From: ${MAIL_SENDER}">>${MAIL_LOG} echo "To: ${MAIL_TO}">>${MAIL_LOG} echo "Content-type: text/html;charset=UTF-8 ">>${MAIL_LOG} echo "Subject:server backup report on ${TODAY} ">>${MAIL_LOG}
至此,脚本实现了全部需求。