#!/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 远程备份日志的更多相关文章

  1. shell脚本备份日志

    #!/bin/sh # back tomcat catalina.out cd /home/log_bak #the file DATE=`date '+%Y%m%d-%H%M'` ARCHIVE=$ ...

  2. shell脚本备份日志文件

    crontab -e crontab -l service crond restart 55 7 * * * /data/app/autoprice7/resin-pro-3.1.15/log_old ...

  3. centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾

    centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾 系统:centos6.5 1.创建脚本目录 mkdir -p /usr/local/sh/ 创建备份web ...

  4. shell脚本备份nginx日志

    vim /data/runlog.sh                                                  #编辑一个 shell 脚本 #!/bin/bash LOGP ...

  5. 【shell脚本】定时备份日志===logBackup.sh

    定时备份日志 设置执行权限 [root@VM_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [root@VM_0_10_centos sh ...

  6. linux实现自动远程备份(scp+ssh)

    刚上线的服务器需要备份日志,要备份到另一台服务器上去,为了减少工作量,采用linux的定时任务去自动执行.因服务器都是linux的,因此采用linux的远程复制scp命令.但这里涉及到一个问题,就是s ...

  7. sql server 远程备份 bak 删除

    前言: 管理一个公司的一个服务器,最近有一些维护SQLserver数据库活弄,写下防止忘了. 因为公司采用SQL\Redis\MongoDB共用,SQL用来存储基础的结构\权限\等一些杂七杂八的东西. ...

  8. Linux下使用crontab定时备份日志

    上周学习了Linux,其中有使用crontab定时备份日志的内容,现把主要步骤记录如下: 首先需要备份的日志的源目录位于/opt/lampp/logs/access_log 备份到/tmp/logs下 ...

  9. PL/SQL远程备份和恢复Oracle数据库

    (转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...

随机推荐

  1. listview设置条目点击的时候不变色(让状态选择器不起作用)

    未设置前的效果如下图: 很明显,“酷狗音乐”那个条目被点击的时候,条目背景变为蓝色,怎么去掉这个颜色呢? java代码可以这么写: listView.setSelector(new ColorDraw ...

  2. JavaBean-- 设置和取得属性

    <jsp:setProperty>标签一共有4种使用方法: 自动匹配:<jsp:setProperty name="实例化对象的名称(id)" property= ...

  3. Android传感器编程带实例(转)

    源:http://www.cnblogs.com/xiaochao1234/p/3894751.html 看了程序人生 网站的 编程高手的编程感悟 深有感触,好像也是一个android 程序员写的,推 ...

  4. PL/SQL DEVELOPER 导出表数据

    http://jingyan.baidu.com/album/fcb5aff78e6a48edab4a7146.html?picindex=4 1. 导出表数据 打开pl/sql客户端 在左侧 点击t ...

  5. typescript中的工具 tsd

    首先帮微软买个广告:VSCode 实在是太适合我了,感觉写起来无比舒畅,建议有兴趣的可以去试试用vsCode写前端. 最近开始使用ts去构建项目,感觉写起来非常的爽(本人以前接触过c#和java),终 ...

  6. java中从含反斜杠路径截取文件名的方法

    例如:获取到的文件路径为C:\Documents and Settings\Leeo\My Documents\logo.gif现在想要取得图片的名称logo.gif,我们知道反斜杠“\”是转义字符, ...

  7. urllib2修改header

    python网络访问的标准模块 urllib与urllib2并不是升级版的关系,具体可见谷歌文章:difference between urllib and urllib2urllib2的官方文档:h ...

  8. composer 的快速安装

    Packagist 镜像 请各位使用本镜像的同学注意: 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 https 协议!请各位同学 按照下面所示的两个方法将 http://pa ...

  9. SpringMVC文件上传报错org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

    错误信息: java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to or ...

  10. Laravel Auth验证

    laravel自带了auth类和User模型来帮助我们很方便的实现用户登陆.判断. 首先,先配置一下相关参数 app/config/auth.php: model 指定模型 table 指定用户表 p ...