每天有空我就观察观察svn,昨天写好一份,但是分布写的,也就是如果我们公司用8个库来存储代码的话,我那个脚本就不能用了,或者需要改动。但这个就不需要了,你只需要在数组REPOSITORY内添加你svn内的库就可以了。无论你有几百个(玩笑),都可以~~~~ 我最喜欢的编辑器界面
环境要求:
系统:centos 5.6
svn version:1.6.11
是否需要mail服务:是,请安装sendmail、mutt(可选 只要你linux那可以发送邮件就可以)
是否与http服务整合:是
第一次改完脚本,请自己看是否保存:
sh -x script.sh --debug
脚本内容:
#!/bin/bash #### //kinggoo.com #### 需要安装sendmail mutt以便发送邮件通知,当然也可以改下代码,弄成网页访问形式也可以 #### 不要删除SVN_LOG后面设置变量的任何文件,否则备份时会自动全备 TIME=`date +%Y%m%d` YM=`date +%Y%m` SVNROOT=/opt/svnroot SVNDATA=/svn SVN_LOG=${SVNDATA}/log TOMAIL=mail@kinggoo.com if [ ! -e ${SVNDATA}/${YM} ] || [ ! -d ${SVNDATA}/${YM} ];then mkdir -p ${SVNDATA}/${YM} SVNDATA=${SVNDATA}/${YM} else SVNDATA=${SVNDATA}/${YM} fi #针对配置http集成svn服务来做,如果你没有将http添加到服务。脚本内是通过http服务生效后返回显示信息OK来判断是否启动的! HTTP=/etc/init.d declare -a REPOSITORY REPOSITORY=( Kinggoo Com ) ARR=0 echo "" > ${SVN_LOG}/svn.mail > /dev/null while [ "${ARR}" -lt "${#REPOSITORY[@]}" ] do if [ ! -e ${SVN_LOG} ] || [ ! -d ${SVN_LOG} ];then mkdir -p ${SVN_LOG} fi if [ ! -e ${SVNDATA}/${REPOSITORY[$ARR]} ] || [ ! -d ${SVNDATA}/${REPOSITORY[$ARR]} ];then mkdir -p ${SVNDATA}/${REPOSITORY[$ARR]} fi BUILD=`svnlook youngest ${SVNROOT}/${REPOSITORY[$ARR]}` && sleep 2 VANCL_BUILD=`cat ${SVN_LOG}/${REPOSITORY[$ARR]}.version` if [ ! -e ${SVN_LOG}/${REPOSITORY[$ARR]}.version ] && [ -z ${VANCL_BUILD} ];then # echo "0" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version echo "${BUILD}" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version VANCL_BUILD=0 else #将最新得到的reversion存储起来,并将之前reversion+1 ((VANCL_BUILD=${VANCL_BUILD}+1)) echo "${BUILD}" > ${SVN_LOG}/${REPOSITORY[$ARR]}.version fi #ago 小于等于 after if [ ${VANCL_BUILD} -le ${BUILD} ];then ${HTTP}/httpd stop |grep -i OK && I=$? sleep 5 if [ "${I}" -eq "0" ];then echo "httpd is stopping" >> ${SVN_LOG}/svn.mail else /usr/bin/pgrep httpd|xargs kill -9 echo "httpd is kill for stopping" >> ${SVN_LOG}/svn.mail fi echo "${REPOSITORY[$ARR]}:${VANCL_BUILD}:${BUILD}" >> ${SVN_LOG}/svn.important svnadmin dump ${SVNROOT}/${REPOSITORY[$ARR]} -r ${VANCL_BUILD}:${BUILD} --incremental > ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${VANCL_BUILD}_${BUILD}.dump.${TIME} 2>> ${SVN_LOG}/${REPOSITORY[$ARR]}.log && sleep 30 && ${HTTP}/httpd start |grep -i OK && I=$? && echo "`ls -l ${SVNDATA}/${REPOSITORY[$ARR]}/${REPOSITORY[$ARR]}.${VANCL_BUILD}_${BUILD}.dump.${TIME}`" >> ${SVN_LOG}/svn.mail if [ "${I}" -eq "0" ];then echo "httpd is running" >> ${SVN_LOG}/svn.mail else echo "httpd is failed" >> ${SVN_LOG}/svn.mail ${HTTP}/httpd restart |grep -i OK && I=$? echo "$I" >> ${SVN_LOG}/svn.mail fi else echo "代码库:${REPOSITORY[$ARR]} , 前一版本:${VANCL_BUILD} 大于后一版本:${BUILD} ,没有执行备份操作!" >> ${SVN_LOG}/svn.mail fi ((ARR=$ARR+1)) unset VANCL_BUILD BUILD BUILD_TEMP done echo "`cat ${SVN_LOG}/svn.mail`" |mutt -s "${TIME}" ${TOMAIL}
脚本下载:svn增量备份脚本 (注意脚本里面有一行 BUILD=500 请将它删除,或者注释掉,这是我测试时候用的)
优化后脚本
【20111201】
+增加每月备份存储在相同年月目录下!
+对明天svn备份的reversion 记录,以便日后批量恢复导入。日志格式(REPOSITORY:前一版本号:最后版本号),均写在同一文件内
【20111202】
+修正某版本库无变动导致服务http服务无法正常启动
【20111204】
+脚本又出问题,没考虑每次备份后写入到库.version文件的信息处理!已经修改!
【20120802】
+脚本首行缺少“#”,感谢sooyoo的提醒!
!/bin/bash 前面没有“#”吗?
hi ,真抱歉,由于我之后有修改过脚本,所以可能被勿删除掉了!是有的!谢谢你的提醒,真的很抱歉~
谢谢分享!
dongnan,哈哈 谢谢,那么仔细帮忙查看!有好的脚本也记得分享哦