#!/bin/bash 下面的代码使用bash进行编译,#是注释的标识
#This scripts for full bakcup svn repository!
#Define Variable , shell变量没有修饰符,是全局变量
SVN="/usr/local/svn" #用于存放错误日志的目录
SVN_PRO="/usr/local/svn/bin/svnadmin hotcopy" #svnadmin hotcopy指令的路径,前面的目录可以在环境变量中配置
SVN_LOOK="/usr/local/svn/bin/svnlook youngest" #svnlook youngest指令的路径,前面的目录可以在环境变量中配置,用于获取版本号
SVN_ROOT=/svn #需要备份的目录
SVN_BACKUP=/svn_backup #备份保存的目录
BACKUP_DATE=$(date +%Y-%m-%d) #获取备份的日期,日期格式为2013-07-02
#check up backup root directory if exist ! 判断备份目录是否存在
if [ ! -e /svn_backup ] #! -e不存在的意思
then mkdir /svn_backup #then与if是一对判断词,默认的还有else,else后无语句,可以省略
fi #if 的结束此 ,case的结束词是esac
#check mount point if not mount 判断能否联通192.168.1.26的服务器
IP="192.168.1.26" #定义新的变量IP
ping -c 1 -w 1 $IP &>/dev/null #使用变量时,要在变量前加$
#ping -c 1 -w 1 $IP 表示测试连接服务器,在前台执行,如果此时输入命令,则不被执行,在前台输出
#ping -c 1 -w 1 $IP & 表示测试连接服务器,在后台执行,如果此时输入命令,则可以被执行,在前台输出,&表示在后台执行
#ping -c 1 -w 1 $IP &>/dev/null 表示表示测试连接服务器,在后台执行,并且不在前台输出,>表示将输出引入到,/dev/null表示一个空文件,进去的内容都会丢失,从里面 #也读不到任何信息
if [ $? = 0 ] #$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
then
#检查文件系统的磁盘空间占用情况,并挂载windows共享盘,也就是使windows下共享盘在linux下可读
#如果操作失败则将日志写在backup_error.log中,退出
#df用于检查磁盘空间占用情况,df -k 表示以k字节为单位显示
df -k | grep $IP &>/dev/null || mount -t cifs //$IP/svnbackup $SVN_BACKUP -o password=123456
else echo "$(date +%Y-%m-%d-%T)==>Backup Computer[$IP] already shutdown!" >>$SVN/backup_error.log
echo " " >>$SVN/backup_error.log
exit 1
fi
#Get repo directory name
REPO_NAME_LIST=$(ls $SVN_ROOT) #获取需要备份目录及文件信息
#define logfile
LOGFILE=$SVN_BACKUP/full_backup.log #定义日志文件名称
#output a backup date to log file
echo "====================$BACKUP_DATE========================" >>$LOGFILE #将备份日期输入到full_backup.log 里
#check up backup directory if exist then exit,if not exist mkdir
if [ -e $SVN_BACKUP/Full_"$BACKUP_DATE" ] #判断今日是否已备份,如果没有,则创建文件
then echo "$(date +%T)==>$SVN_BACKUP/Full_"$BACKUP_DATE" already exists!" >>$LOGFILE
echo "Thers is no need backup again!" >>$LOGFILE
exit 1
else mkdir $SVN_BACKUP/Full_"$BACKUP_DATE"
fi
#mkdir full_repo_number if not exsits!
#full_repo_number purpose is leave with repo number single file for each repo
if [ ! -e $SVN_BACKUP/full_repo_number ]
then
mkdir $SVN_BACKUP/full_repo_number
fi
#define variables for full_repo_numher
FULL_REPO_VERSION=$SVN_BACKUP/full_repo_number
#start backup
for repo_name in $REPO_NAME_LIST
do
#get repo version
get_repo_version=$($SVN_LOOK $SVN_ROOT/$repo_name) #使用svnlook youngest指令获取SVN_ROOT/repo_name这个文件的版本号
#full backup 全量备份
$SVN_PRO $SVN_ROOT/$repo_name $SVN_BACKUP/Full_"$BACKUP_DATE"/$repo_name #使用svnadmin hotcopy指令备份SVN_ROOT/repo_name 到 #SVN_BACKUP/Full_"BACKUP_DATE"/repo_name
echo "$(date +%T)==> repository:[$repo_name] at version($get_repo_version) Successfull Full Backup !" >>$LOGFILE
#output repo version number to /svn_backup/full_repo_number directory 将版本号写入$repo_name.number文件中
echo "$get_repo_version" >$FULL_REPO_VERSION/$repo_name.number
done
#output a blank line to log file
echo "" >>$LOGFILE #给full_backup.log 文件加一个空行