#!/bin/bash #Function:自动备份给定列表中的目录或文件,并且可以保留N天备份的档案。
#可备份至远程主机指定的目录下,但需本机能免密码登录到远程主机,用到ssh-keygen
#该脚本分为两个文件:执行文件backup.sh和备份项目文件bakfile.lst,两个文件必须位于同一目录下
#Author:JianJie #Date:2016/8/26 #Usage:sudo bash backup.sh & #Version:v2 ###############################################################
logFile=/backup/local/log/`date +"%Y-%m"`.log
#日志文件
logDir=/backup/local/log myDate=`date +"%Y-%m-%d"`
bakFileLst=bakfile.lst
#需要备份的文件或目录放到该文件中 bakDir=/backup/local
#备份至此目录 keepDays=5
#文件保留天数 remoteHost="rhel6.8:rhel7"
#需要备份至远程主机的地址,注意本机需免密码登陆到远程主机,多个主机地址或主机名之间用‘:’分割 remoteHostDir=/backup/$HOSTNAME
#远程主机备份目录 currentDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#当前运行脚本所在的目录
###############################################################
#判断日志目录和日志文件是否存在
if [ ! -d $logDir ];then
mkdir -p $logDir
touch $logFile else
if [ ! -e $logFile ];then
touch $logFile
fi
fi
#开始记录日志
echo "Backup start at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
echo "--------------------------------------------------------" >> $logFile
echo " " >> $logFile
#判断保存备份文件的文件列表'bakfile.lst'是否存在
if [ ! -e $currentDir/$bakFileLst ];then
echo "Error:Important file [$currentDir/$bakFileLst] has been lost,now creating..." >> $logFile
touch $currentDir/$bakFileLst
echo "The file [$currentDir/$bakFileLst] has been created,but you still need to write data in it!" >> $logFile
echo " " >> $logFile echo "--------------------------------------------------------" >> $logFile
echo "Backup end at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
echo " " >> $logFile
exit 3
fi
paths=`cat $currentDir/$bakFileLst`
for path in $paths
do
baseName=`echo "$path" | xargs basename`
oldFile=$bakDir/$baseName.$(date --date="$keepDays days ago" +"%Y-%m-%d").txz
#判断路径中备份的是文件还是目录
#若路径中要备份的是文件,则先进入指定路径中的上一级
if [ -f "$path" ];then
#进入指定路径中的上一级目录
cd `echo "$path" | cut -d "/" -f 1-$(echo "$path"|gawk -F"/" '{print NF-1}')`
#若要备份的文件已经存在,则不再重复备份
if [ -f $bakDir/$baseName.$myDate.txz ];then
echo "Backup file [$bakDir/$baseName.$myDate.txz] already exists!" >> $logFile
else
cp -RHpf $baseName $bakDir
cd $bakDir
#备份档案格式为.tar.xz,可根据需要调整,如.tar.gz或者.tar.bz2
tar -cJf $baseName.$myDate.txz $baseName
#将备份后的文件通过scp备份到远程主机
for host in $(echo "$remoteHost" | sed 's/:/ /g')
do
scp -o ConnectTimeout=10 $baseName.$myDate.txz $host:$remoteHostDir >>$logFile 2>/dev/null && \
echo "Successful backup [$path] to the remote host:[$host:$remoteHostDir]" >>$logFile || \
echo "Backup [$path] to the remote host:[$host:$remoteHostDir] failed,please check it" >>$logFile
done
#备份完成,删除拷贝过来的源文件
rm -rf $baseName
echo "Backup [$path] done into [$bakDir] successfuly!" >> $logFile
#若存在N天前旧文件,则删除它
if [ -f $oldFile ];then
rm -rf $oldFile
echo "[$oldFile],delete old file successfuly!" >> $logFile
fi
fi
#路径中备份的是目录
elif [ -d "$path" ];then
#先判断要备份的文件是否已经存在,若存在则不再重复备份
if [ -f $bakDir/$baseName.$myDate.txz ];then
echo "Backup file [$bakDir/$baseName.$myDate.txz] already exists!" >> $logFile
else
cd $path
cd ..
cp -RHpf $baseName $bakDir
cd $bakDir
tar -cJf $baseName.$myDate.txz $baseName
#将备份后的文件通过scp备份到远程主机
for host in $(echo "$remoteHost" | sed 's/:/ /g')
do
scp -o ConnectTimeout=10 $baseName.$myDate.txz $host:$remoteHostDir >>$logFile 2>/dev/null && \
echo "Successful backup [$path] to the remote host:[$host:$remoteHostDir]" >>$logFile || \
echo "Backup [$path] to the remote host:[$host:$remoteHostDir] failed,please check it" >>$logFile
done
#备份完成,删除拷贝过来的源文件
rm -rf $baseName
echo "Backup [$path] done into [$bakDir] successfuly!" >> $logFile
#若存在N天前旧文件,则删除它
if [ -f $oldFile ];then
rm -rf $oldFile
echo "[$oldFile],delete old file successfuly!" >> $logFile
fi
fi
else
echo "Wrong path or file:[$path],please check it" >>$logFile fi done echo " " >> $logFile echo "-------------------------------------------" >> $logFile
echo "Backup end at $(date +"%Y-%m-%d %H:%M:%S")" >> $logFile
echo " " >> $logFile
exit 0
- shell脚本备份日志
#!/bin/sh # back tomcat catalina.out cd /home/log_bak #the file DATE=`date '+%Y%m%d-%H%M'` ARCHIVE=$ ...
- shell脚本备份日志文件
crontab -e crontab -l service crond restart 55 7 * * * /data/app/autoprice7/resin-pro-3.1.15/log_old ...
- centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾
centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾 系统:centos6.5 1.创建脚本目录 mkdir -p /usr/local/sh/ 创建备份web ...
- shell脚本备份nginx日志
vim /data/runlog.sh #编辑一个 shell 脚本 #!/bin/bash LOGP ...
- 【shell脚本】定时备份日志===logBackup.sh
定时备份日志 设置执行权限 [root@VM_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [root@VM_0_10_centos sh ...
- linux实现自动远程备份(scp+ssh)
刚上线的服务器需要备份日志,要备份到另一台服务器上去,为了减少工作量,采用linux的定时任务去自动执行.因服务器都是linux的,因此采用linux的远程复制scp命令.但这里涉及到一个问题,就是s ...
- sql server 远程备份 bak 删除
前言: 管理一个公司的一个服务器,最近有一些维护SQLserver数据库活弄,写下防止忘了. 因为公司采用SQL\Redis\MongoDB共用,SQL用来存储基础的结构\权限\等一些杂七杂八的东西. ...
- Linux下使用crontab定时备份日志
上周学习了Linux,其中有使用crontab定时备份日志的内容,现把主要步骤记录如下: 首先需要备份的日志的源目录位于/opt/lampp/logs/access_log 备份到/tmp/logs下 ...
- PL/SQL远程备份和恢复Oracle数据库
(转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...
随机推荐
- Linux 排除问题的前5分钟
尽可能搞清楚问题的前因后果 不要一下子就扎到服务器前面,你需要先搞明白这台服务器有多少已知的情况,还有故障的具体情况,不然你很有可能是在无的放矢 必须要搞清楚的问题: 故障的表现是什么?无响应?报 ...
- Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...
- CentOS6.5 安装snorby
如果下列任何组件之一已经被安装,请酌情忽略 1.Snort 参照 CentOS6.5 安装snort 2.GIT 系统自带 3.Ruby 版本限制> 1.9.2 系统自带版本过低首先卸载掉,注意 ...
- ANSI X9.8标准 PIN xor PAN获取PIN BlOCK
ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下: (1) AN ...
- inotify-java linux系统监听文件发生变化,实时通知java程序
1 Overview 最近公司的一个任务需要实时监控文件系统中某个文件的内容变化.由于程序本身由Java编写,因此使用了inotify- java(http://code.google.com ...
- POJ 3683 Priest John's Busiest Day
2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...
- 一个门外汉的理解 ~ Faster R-CNN
首先放R-CNN的原理图 显然R-CNN的整过过程大致上划分为四步: 1.输入图片 2.生成候选窗口 3.对局部窗口进行特征提取(CNN) 4.分类(Classify regions) 而R-CNN的 ...
- Spring 笔记1
1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...
- [转]JavaScript通过参数动态调用函数——js中eval实现反射
以下文章出自 http://blog.rongzhiwang.com/king/archive/2012/08/13/javascriptjseval.aspx 今天碰到人问这样一个问题 ...
- jquery全选框的实现
函数实现的话: head里加入函数实现 <script language="javascript" type="text/javascript"> ...