#!/sbin/bash
#
# backup.sh
#
# Upload the apache log to 192.168.1.100 machine
#
# Copyright (c) 2013 by MagicalCode, P.R.China
#
# modification history:
# --------------------
# 2013/11/6, by MagicalCode, Create
#
# 程序详细设计方案参考地址:http://blog.csdn.net/magicalcode/article/details/18669231
#
#导入需要的模块脚本
. log.sh
#---需要自己手动配置的变量------
LocalBackUpPath='/search/dataBackUp/testData/log' #apahce日志的目录
BackUpMode='EveryMonth' #备份模式:'EveryDay','EveryMonth','EveryYear','EveryHour'...
BackUpBaseNumber=1 #备份基数
SuffixMode='[0-9]{2}' #文件匹配后缀模型
LocalBackUpUser=backup #本地备份用户
DestHost=192.168.1.100 #目标机器(磁盘柜)
DestBackUpUser=backup #目标机器备份用户
DestPath='/data/backup' #目标机器备份路径
#---系统生成变量-------
SystemPath=`pwd` #系统路径
TmpFindFileList=${SystemPath}"/tmp/tmp.findFileList.txt" #临时文件,存储找到的文件基本信息
TmpPreZipFileList=$SystemPath"/tmp/tmp.preZipList.txt" #临时文件,压缩前的文件列表信息
TmpAftZipFileList=$SystemPath"/tmp/tmp.aftZipList.txt" #临时文件,压缩后的文件列表信息
RmReadyFile=$SystemPath/"rmReady.info" #等待删除的文件信息
BackUpDate=$(date +'%Y-%m-%d') #备份日期
BackUpTime=$(date +'%H:%M:%S') #备份时间
#(step)根据备份模式与备份基数设置日期模型,并且配置删除日期
if [[ ${BackUpBaseNumber} -lt 0 && ${BackUpBaseNumber} -gt 366 ]]
then
MsgLog 'BackUp' 'ERROR' "BackUpBaseNumber must between 0 and 366"
exit 1
fi
case ${BackUpMode} in
'EveryDay')
DateMode=`date -d "-${BackUpBaseNumber} day" +'%Y%m%d'`
DeleteDate=`date -d "${DateMode} $((${BackUpBaseNumber}+1)) day" +'%Y%m%d'`
;;
'EveryMonth')
DateMode=`date -d "-${BackUpBaseNumber} month" +'%Y%m'`
DeleteDate=`date -d "${DateMode}01 $((${BackUpBaseNumber}+1)) month" +'%Y%m%d'`
;;
'EveryYear')
DateMode=`date -d "-${BackUpBaseNumber} year" +'%Y'`
DeleteDate=`date -d "${DateMode}0101 $((${BackUpBaseNumber}+1)) year" +'%Y%m%d'`
;;
*)
MsgLog 'BackUp' 'ERROR' "BackUpMode not found!"
exit 1
;;
esac
#(step)根据日期模型与文件后缀模型设置文件匹配模型以及压缩文件名
FileMatchMode="access_log_${DateMode}${SuffixMode}"
ZipFileName=access_log_${DateMode}.zip
ZipFile=$SystemPath"/tmp/"$ZipFileName
#(step)根据文件匹配模型,找到相应的文件,保存文件基本信息
cd $LocalBackUpPath
ls -l --time-style '+%Y-%m-%d %H:%M:%S' |
grep -E $FileMatchMode |
awk '{
FileName=$8;
FileSize=$5;
CreateDate=$6;
CreateTime=$7;
print FileName,FileSize,CreateDate,CreateTime,
LocalBackUpPath"/"FileName,DestHost,DestBackUpUser,
DestPath"/"ZipFileName,BackUpDate,BackUpTime,DeleteDate;
}' LocalBackUpPath=$LocalBackUpPath DestHost=$DestHost \
DestBackUpUser=$DestBackUpUser DestPath=$DestPath \
ZipFileName=$ZipFileName BackUpDate=$BackUpDate \
BackUpTime=$BackUpTime DeleteDate=$DeleteDate | \
sort -k 1 > ${TmpFindFileList}
#(step)记录压缩前的文件列表与大小信息
cat ${TmpFindFileList} | awk '{FileName=$1;FileSize=$2;print FileName,FileSize}' > ${TmpPreZipFileList}
if [ ! -s $TmpPreZipFileList ]
then
MsgLog 'BackUp' 'ERROR' "TmpPreZipFileList can not be Empty."
exit 1
fi
#(step)归档与压缩找到的文件
FileList=`cat ${TmpFindFileList} | awk '{print $1}'`
zip $ZipFile $FileList >/dev/null 2>&1
if [ $? -ne 0 ]
then
MsgLog 'BackUp' 'ERROR' "zip Error."
exit 1
fi
#(step)校验压缩后的列表与压缩前文件[文件名,文件大小]
unzip -l $ZipFile | grep -E $FileMatchMode | awk '{FileName=$4;FileSize=$1;print FileName,FileSize;}' | sort -k 1 > $TmpAftZipFileList
if [ ! -s $TmpAftZipFileList ]
then
MsgLog 'BackUp' 'ERROR' "TmpAftZipFileList can not be Empty."
exit 1
fi
ErrMsg=`diff $TmpPreZipFileList $TmpAftZipFileList`
if [[ ! -z $ErrMsg ]]
then
MsgLog 'BackUp' 'ERROR' "TmpPreZipList != TmpAftZipList."
exit 1
fi
#(step)计算网络传输前zip的md5值
PreNetworkZipMd5=`md5sum $ZipFile | awk '{StrMd5=$1; print StrMd5;}'`
if [[ ${#PreNetworkZipMd5} -ne 32 ]]
then
MsgLog 'BackUp' 'ERROR' "md5 zipfile error brefore network ."
exit 1
fi
#(step)网络传输zip文件(ssh-key无密码登陆)
su $LocalBackUpUser -c "rsync -e ssh -avz $ZipFile $DestBackUpUser@$DestHost:$DestPath > /dev/null 2>&1"
if [ $? -ne 0 ]
then
MsgLog 'BackUp' 'ERROR' "network error."
exit 1
fi
#(step)校验网络传输的正确性 [网络传输前后的md5值进行比较]
AftNetworkZipMd5=$(su $LocalBackUpUser -c "ssh $DestBackUpUser@$DestHost md5sum $DestPath'/'$ZipFileName | cut -c1-32")
if [[ ${#AftNetworkZipMd5} -ne 32 ]]
then
MsgLog 'BackUp' 'ERROR' "md5 zipfile error aft network ."
exit 1
fi
if [[ $PreNetworkZipMd5 != $AftNetworkZipMd5 ]]
then
MsgLog 'BackUp' 'ERROR' "PreNetworkZipMd5 != AftNetworkZipMd5 ."
rm -f $ZipFile
exit 1
fi
#(step)将findList加入到rmReady.info中,等待删除
cat $TmpFindFileList >> $RmReadyFile
if [ $? -ne 0 ]
then
MsgLog 'BackUp' 'ERROR' "add findlist to RmReadyFile error."
rm -f $ZipFile
exit 1
fi
#(step)删除本地的zip文件;删除临时文件
rm -f $ZipFile
if [ $? -ne 0 ]
then
MsgLog 'BackUp' 'ERROR' "rm zipfile error."
fi
rm -f $TmpFindFileList $TmpPreZipFileList $TmpAftZipFileList
if [ $? -ne 0 ]
then
MsgLog 'BackUp' 'ERROR' "rm tmpfile error."
fi
#(step)输出工作正常的信号
MsgLog 'BackUp' 'OK' "All work over ,they are all OK.\
FileMatchMode:${FileMatchMode};\
DestZipPath:${DestPath}"/"${ZipFileName}
"
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
httpdLogBackUp.1.0.0.zip (4个子文件)
httpdLogBackUp
backup.sh 6KB
start.sh 922B
log.sh 2KB
rm.sh 3KB
共 4 条
- 1
资源评论
- kenloveting2016-08-03不错的脚本,值得参考,谢谢分享。
MagicalCode
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功