zoukankan      html  css  js  c++  java
  • 备份和校验脚本-邮件通知

    我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
    个人博客:传送阵
    笔者微信:zhanghe15069028807,非诚勿扰。

    需求分析

    基本需求

    客户端需求:

    1. 客户端每天凌晨01点在服务器本地打包备份(系统配置文件、日志文件、应用配置文件等)
    2. 客户端备份的数据打包存放在以主机名_IP地址_当前时间命名的文件中
    3. 客户端最后通过rsnyc推送本地打包好的文件到backup服务器
    4. 客户端服务器保存最近7天的数据,避免浪费空间

    服务端需求:

    1. 服务器端部署rsync,用于接收客户端推送过来的数据
    2. 服务端需要每天校验客户端推送过的数据是否完整
    3. 服务端需要将每天校验的结果通过QQ邮箱通行给运维工程师
    4. 服务端仅保留6个月的备份数据

    客户端需求分析1,2

    面对这样的大案例或者称之为小项目,先稳住,一步一步来,先来看客户端的需求。

    1、你要备份什么?

    其实备份什么并不重要,我们后来可以根据需求指定,我们先随便写几个,/etc/fstab,/etc/hosts,/var/spool/cron/root

    2、备份到哪里?

    备份到一个目录当中,可以可以在根下面单独创建一个备份用的目录backup

    [root@web1 ~]# mkdir /backup
    [root@web1 ~]# cd /    #先CD到根下,在打包的时候使用相对路径,这样就不会报:"tar: Removing leading `/' from member names"
    [root@web1 /]# tar -zcf backup/backup.tar.gz etc/hosts etc/fstab var/spool/cron/root 
    

    注:我们我们非要使用绝对路径的话,不想先CD到根下,在打包的时候就要使用zcPf这四个选项,在原来的基础上加了一个P。

    3、备份成什么格式?

    HOSTNAME_IP_DATA

    通过hostname命令取出主机名

    通过hostname -i 或者ifconfig | awk 取于IP地址

    通过date命令取出时间

    [root@BACKUP ~]# hostname -I | cut -d' ' -f1
    192.168.80.200
    [root@BACKUP ~]# hostname
    BACKUP
    [root@BACKUP ~]# date +%F
    2019-10-29
    

    那么如何将这些命令拼接到一起呢?通过反引号或者$()都可以,如下所示:

    [root@BACKUP ~]# echo $(hostname)_$(hostname -I | cut -d' ' -f1)_$(date +%F)
    BACKUP_192.168.80.200_2019-10-29
    

    我们结合上面的打包命令,其实就可以这样写,如下所示:

    mkdir /backup
    tar -zcPf /backup/$(hostname)_$(hostname -I | cut -d' ' -f1)_$(date +%F).tar.gz /etc/hosts /etc/fstab /var/spool/cron/root
    

    如上所示,第二条命令也太长了,反正这个案例我们要写入到脚本当中,如果写入到脚本当中我们是可以用变量的,用变量的话看起来简洁许多,如下所示:

    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    
    #第二步,创建备份的目录
    mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf backup/$Host_$Ip_$Date.tar.gz etc/hosts etc/fstab var/spool/cron/root
    

    这个脚本看起来没有啥错误,但是一执行就出毛病了,结果/backup里面的文件名字不对,并不是主机名_IP_时间的格式,因为什么呢?我们看到上面的第13行命令,看起来没啥错误,但是由于我们使用了$变量下划线和方式,结果导致系统把下划线也识别成变量的一部分了,这样肯定找不到我们上面定义的变量了,怎么办呢?我们可以改进一下,如下所示:

    [root@web1 scripts]# cat backup.sh 
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    
    #第二步,创建备份的目录
    mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf backup/${Host}_${Ip}_${Date}.tar.gz etc/hosts etc/fstab var/spool/cron/root  #用中括号将变量包起来就行了
    

    如下所示,在第14行当中,命令还是太长了,我们可以通过变量再进一步简化一下,如下所示:

    [root@web1 scripts]# cat backup.sh 
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}   #把这三个变量结合起来,变成一个变量
    
    #第二步,创建备份的目录
    mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf backup/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    

    再优化一下,bakcup这个目录其实也可以定义成变量,这样我们以后更改的时候也方便呀,改进,如下所示:

    [root@web1 ~]# cat /scripts/backup.sh 
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup         #把/backup定义成变量
    
    #第二步,创建备份的目录
    mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf $Path/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    
    

    如上所示,这个脚本已经写的不错了,但是当我们第二次执行的时候,就会报错,如下所示:

    [root@web1 ~]# /bin/bash /scripts/backup.sh 
    mkdir: cannot create directory ‘/backup’: File exists 
    

    如上所示,报错的原因是因为/backup这个目录在脚本执行第一次的时候就已经创建好了,第二个执行当然会提示目录已经存在,那怎么办呢?加判断咯!如下所示:

    [root@web1 ~]# cat /scripts/backup.sh 
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup   #加一个判断,-d就是判断/backup目录是否存在
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf $Path/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    

    客户端需求分析(3、4)

    客户端需求:

    1. 客户端每天凌晨01点在服务器本地打包备份(系统配置文件、日志文件、应用配置文件等)
    2. 客户端备份的数据打包存放在以主机名_IP地址_当前时间命名的文件中
    3. 客户端最后通过rsnyc推送本地打包好的文件到backup服务器
    4. 客户端服务器保存最近7天的数据,避免浪费空间

    通过以上我们的分析我们才完成第一个和第二个需求,我们再来分析第三个和第四个需求,由于我们这一个需求,是建立在客户端与服务器的rsync同步功能完全测试成功之后,所以第三个需求反而是简单了,怎么完成第三个需求呢?

    定义一个虚拟用户的密码变量,这样我们使用的时候就不用再手动输入密码了,如下所示:

    vim /scripts/backup.sh 
    
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf $Path/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path rsync_backup@192.168.80.200::backup
    

    我们试了一下,将客户端上一执行脚本,同步没有问题,但是同步的是客户端上/backup这个目录,而不是/backup里面的文件,这怎么弄呢?只要在$Path变量后面加一个/就可以了,如下所示:

    [root@web1 ~]# cat /scripts/backup.sh
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf $Path/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path/ rsync_backup@192.168.80.200::backup
    

    好了,第三个需求,我们也完成了,我们该做第四个需求了:客户端服务器保存最近7天的数据,避免浪费空间

    最后一个需求最容易完成,我们通过find的-mtime选项,就可以了,保存最近七天,其实也就是说删除七天之前的,那么怎样保留七天之内的文件呢?只要把7天前的文件全部都删除了不就行了吗!

    上面我们的脚本,每天只是运行一次,如果一天之内执行两次就会覆盖之间的。

    我们先生成30个文件,然后尝试一下,删除7前之间的,保留7天之内的,我们只要用一个for循环就可以实现。

    #!/bin/bash     
    for i in {1..30}
    do
            date -s 2019/10/$i
            /bin/bash /scripts/backup.sh
    done
    
    [root@web1 ~]# ll /backup/
    total 120
    -rw-r--r-- 1 root root 509 Oct  1 00:00 web1_192.168.80.166_2019-10-01.tar.gz
    -rw-r--r-- 1 root root 509 Oct  2 00:00 web1_192.168.80.166_2019-10-02.tar.gz
    -rw-r--r-- 1 root root 509 Oct  3 00:00 web1_192.168.80.166_2019-10-03.tar.gz
    -rw-r--r-- 1 root root 509 Oct  4 00:00 web1_192.168.80.166_2019-10-04.tar.gz
    -rw-r--r-- 1 root root 509 Oct  5 00:00 web1_192.168.80.166_2019-10-05.tar.gz
    -rw-r--r-- 1 root root 509 Oct  6 00:00 web1_192.168.80.166_2019-10-06.tar.gz
    -rw-r--r-- 1 root root 509 Oct  7 00:00 web1_192.168.80.166_2019-10-07.tar.gz
    -rw-r--r-- 1 root root 509 Oct  8 00:00 web1_192.168.80.166_2019-10-08.tar.gz
    -rw-r--r-- 1 root root 509 Oct  9 00:00 web1_192.168.80.166_2019-10-09.tar.gz
    -rw-r--r-- 1 root root 509 Oct 10 00:00 web1_192.168.80.166_2019-10-10.tar.gz
    -rw-r--r-- 1 root root 509 Oct 11 00:00 web1_192.168.80.166_2019-10-11.tar.gz
    -rw-r--r-- 1 root root 509 Oct 12 00:00 web1_192.168.80.166_2019-10-12.tar.gz
    -rw-r--r-- 1 root root 509 Oct 13 00:00 web1_192.168.80.166_2019-10-13.tar.gz
    -rw-r--r-- 1 root root 509 Oct 14 00:00 web1_192.168.80.166_2019-10-14.tar.gz
    -rw-r--r-- 1 root root 509 Oct 15 00:00 web1_192.168.80.166_2019-10-15.tar.gz
    -rw-r--r-- 1 root root 509 Oct 16 00:00 web1_192.168.80.166_2019-10-16.tar.gz
    -rw-r--r-- 1 root root 509 Oct 17 00:00 web1_192.168.80.166_2019-10-17.tar.gz
    -rw-r--r-- 1 root root 509 Oct 18 00:00 web1_192.168.80.166_2019-10-18.tar.gz
    -rw-r--r-- 1 root root 509 Oct 19 00:00 web1_192.168.80.166_2019-10-19.tar.gz
    -rw-r--r-- 1 root root 509 Oct 20 00:00 web1_192.168.80.166_2019-10-20.tar.gz
    -rw-r--r-- 1 root root 509 Oct 21 00:00 web1_192.168.80.166_2019-10-21.tar.gz
    -rw-r--r-- 1 root root 509 Oct 22 00:00 web1_192.168.80.166_2019-10-22.tar.gz
    -rw-r--r-- 1 root root 509 Oct 23 00:00 web1_192.168.80.166_2019-10-23.tar.gz
    -rw-r--r-- 1 root root 509 Oct 24 00:00 web1_192.168.80.166_2019-10-24.tar.gz
    -rw-r--r-- 1 root root 509 Oct 25 00:00 web1_192.168.80.166_2019-10-25.tar.gz
    -rw-r--r-- 1 root root 509 Oct 26 00:00 web1_192.168.80.166_2019-10-26.tar.gz
    -rw-r--r-- 1 root root 509 Oct 27 00:00 web1_192.168.80.166_2019-10-27.tar.gz
    -rw-r--r-- 1 root root 509 Oct 28 00:00 web1_192.168.80.166_2019-10-28.tar.gz
    -rw-r--r-- 1 root root 509 Oct 29 00:00 web1_192.168.80.166_2019-10-29.tar.gz
    -rw-r--r-- 1 root root 509 Oct 30 00:00 web1_192.168.80.166_2019-10-30.tar.gz
    [root@web1 ~]# find /backup/ -type f -mtime +7 | xargs rm -f
    [root@web1 ~]# ll /backup     #成功的保留了最近7天的文件。
    total 32
    -rw-r--r-- 1 root root 509 Oct 23 00:00 web1_192.168.80.166_2019-10-23.tar.gz
    -rw-r--r-- 1 root root 509 Oct 24 00:00 web1_192.168.80.166_2019-10-24.tar.gz
    -rw-r--r-- 1 root root 509 Oct 25 00:00 web1_192.168.80.166_2019-10-25.tar.gz
    -rw-r--r-- 1 root root 509 Oct 26 00:00 web1_192.168.80.166_2019-10-26.tar.gz
    -rw-r--r-- 1 root root 509 Oct 27 00:00 web1_192.168.80.166_2019-10-27.tar.gz
    -rw-r--r-- 1 root root 509 Oct 28 00:00 web1_192.168.80.166_2019-10-28.tar.gz
    -rw-r--r-- 1 root root 509 Oct 29 00:00 web1_192.168.80.166_2019-10-29.tar.gz
    -rw-r--r-- 1 root root 509 Oct 30 00:00 web1_192.168.80.166_2019-10-30.tar.gz
    

    好了,现在我们就可以再改进一下脚本了,如下所示:

    [root@web1 ~]# cat /scripts/backup.sh
    #!/bin/bash
    #################################################
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    cd / && 
    tar -zcPf $Path/$Dest.tar.gz etc/hosts etc/fstab var/spool/cron/root
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path/ rsync_backup@192.168.80.200::backup
    
    #第五步,仅保存最近七天的数据
    find $Path -type f -mtime +7 | xargs rm -f
    

    好了,到此,客户端的需求我们就全部实现了,下面就来看一下服务端的需求。

    服务器需求分析

    三、服务器需求分析

    服务端需求:

    1. 服务器端部署rsync,用于接收客户端推送过来的数据
    2. 服务端需要每天校验客户端推送过的数据是否完整
    3. 服务端需要将每天校验的结果通过QQ邮箱通行给运维工程师
    4. 服务端仅保留6个月的备份数据

    服务端一共四个需求,其实第一个我们早已经实现了,第四个也很容易实现,因为第四个需求五客户端的最后一个需求差不多,我们只需要改变一个数字即可,如下:

    find /backup -type f -mtime +180 | xargs rm -f
    

    我们主要关注的就是第二个和第三个需求,我们先为看第三个需求,应该如何实现?这个要求我们服务器上的邮件服务和QQ邮件服务做一个联动,我们先要保证QQ开启SMTP和POP3服务,如下所示:

    然后,我们在服务器上做一些配置:

    [root@BACKUP ~]# yum -y install mailx
    [root@BACKUP ~]# cat /etc/mail.rc 
    set from=746620446@qq.com
    set smtp=smtps://smtp.qq.com:465
    set smtp-auth-user=746620446@qq.com
    set smtp-auth-password=dpoprxkbdbjbbffj    #授权码,通过上图中的选项获取
    set smtp-auth=login
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb/
    [root@BACKUP ~]# mail -s "测试一下" 746620446@qq.com < /etc/issue  #自己给自己发一个邮件
    

    效果如下:

    好,邮件通知的文件解决了,只剩下最后一个问题了,就是校验的需求。所谓的校验的目的就是保证数据从客户端传送服务器的过程当中没有被修改,我们只需要用一个密码学的单向散列算法中的雪崩效应就可以实现了,我们先小小的举一个例子:

    [root@BACKUP ~]# md5sum /etc/passwd
    54996d3781b7674943ae8028651b3121  /etc/passwd   #对这个文件生成一个校验码
    [root@BACKUP ~]# useradd testuser                #修改一下这个文件
    [root@BACKUP ~]# md5sum /etc/passwd             #再算一次,校验码就变了,说明文件被更改了
    55f83fbf8adf24aef6268b55cb8d4f1c  /etc/passwd
    [root@BACKUP ~]# md5sum /etc/passwd            #如果不更改,校验码就会一直保持不会变
    55f83fbf8adf24aef6268b55cb8d4f1c  /etc/passwd
    [root@BACKUP ~]# md5sum /etc/passwd           #如果不更改,校验码就会一直保持不会变  
    55f83fbf8adf24aef6268b55cb8d4f1c  /etc/passwd
    [root@BACKUP ~]# md5sum /etc/passwd            #如果不更改,校验码就会一直保持不会变
    55f83fbf8adf24aef6268b55cb8d4f1c  /etc/passwd
    

    那上面我们是手工进行验证,我们将来可是要将这个过程写入到脚本当中,物资得想一下怎样让这个过程自动化一点,其实我们可以将md5sum的输出放置到一个文件当中,然后通过md5sum这外软件的-c选项自动进行验证,验证通过会验证ok,如果不通过就会报错!如下所示:

    [root@BACKUP ~]# md5sum /etc/passwd > /tmp/test.a
    [root@BACKUP ~]# useradd usera
    [root@BACKUP ~]# md5sum -c /tmp/test.a   
    /etc/passwd: FAILED    #看,不一样就会报错
    md5sum: WARNING: 1 computed checksum did NOT match
    
    [root@BACKUP ~]# md5sum /etc/passwd > /tmp/test.b
    [root@BACKUP ~]# md5sum -c /tmp/test.b    #正常就会显示OK
    /etc/passwd: OK
    

    生成服务端脚本

    服务器的每一个步骤,我们都能实现了,我们下面要想着,如何将这个分散的步骤,融合到一个脚本当中。

    服务端需求:

    1. 服务器端部署rsync,用于接收客户端推送过来的数据
    2. 服务端需要每天校验客户端推送过的数据是否完整
    3. 服务端需要将每天校验的结果通过QQ邮箱通行给运维工程师
    4. 服务端仅保留6个月的备份数据

    好,关于第二个需求,要求我们要在客户端先进行生成校验文件,然后服务器端再执行校验,而且我们在生成校验的文件时候最好是把脚本和打包的数据一同进行校验,这样更保险安全,所以我们要修改一下客户端的脚本,加上打包脚本的操作和生成校验码的操作,客户端修改好的脚本如下,加了第17和第18行。

    [root@web1 ~]# cat /scripts/backup.sh
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    mkdir -pv $Path/$Dest && >/dev/null
    cd / && 
    tar czf $Path/$Dest/sys.tar.gz etc/hosts etc/fstab var/spool/cron/root && 
    tar czf $Path/$Dest/other.tar.gz server/scripts/  && 
    md5sum $Path/$Dest/*.tar.gz > $Path/$Dest/flag && 
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path/ rsync_backup@192.168.80.200::backup
    
    #第五步,仅保存最近七天的数据
    find $Path -type f -mtime +7 | xargs rm -f
    
    

    这样客户端一执行脚本的话,会生几个文件?三个,一个是打包的配置文件,一个是打包的脚本,还有一个是这两个文件的校验文件,这三个文件都保存在 $Path/$Dest目录里面了。

    我们可以把客户端和服务端/bakcup里面所有的文件都清除,然后执行一遍这个脚本,看看效果,如下所示:

    [root@BACKUP ~]# rm -rf /backup/*
    [root@web1 ~]# rm -rf /backup/*
    [root@web1 scripts]# /bin/bash backup.sh 
    
    [root@web1 scripts]# tree /backup/
    /backup/
    └── web1_192.168.80.166_2019-10-30
        ├── flag
        ├── other.tar.gz
        └── sys.tar.gz
    
    [root@BACKUP ~]# tree /backup/
    /backup/
    └── web1_192.168.80.166_2019-10-30
        ├── flag
        ├── other.tar.gz
        └── sys.tar.gz
    

    好,关于校验的问题,客户端已经写好了,那服务端怎样写呢?这样,如下所示:

    [root@BACKUP ~]# cat /server/scripts/backup.sh
    #!/bin/bash
    
    #第一步,定义变量
    Path=/backup
    Date=$(date +%F)
    
    #第二步,进行校验
    md5sum -c $Path/*_$Date/flag
    
    [root@BACKUP ~]# /bin/bash /server/scripts/backup.sh 
    /backup/web1_192.168.80.166_2019-10-30/other.tar.gz: OK
    /backup/web1_192.168.80.166_2019-10-30/sys.tar.gz: OK
    

    这个最难的需求完成之后,我们就可以将第三个需求和第二个需求结合起来了,那服务器的脚本就应该这么写,如下所示:

    [root@BACKUP ~]# cat /server/scripts/backup.sh
    #!/bin/bash
    
    #第一步,定义变量
    Path=/backup
    Date=$(date +%F)
    
    #第二步,进行校验
    md5sum -c $Path/*_$Date/flag > $Path/result_$Date
    
    #第三步,发邮件
    mail -s "Rsync Backup $Date" 746620446@qq.com <  $Path/result_$Date
    

    结果,如下所示,还是比较成功的:

    好了,事不宜迟,我们把第最后一个需求也添加到脚本里面,如下所示:

    [root@BACKUP ~]# cat /server/scripts/backup.sh
    #!/bin/bash
    
    #第一步,定义变量
    Path=/backup
    Date=$(date +%F)
    
    #第二步,进行校验
    md5sum -c $Path/*_$Date/flag > $Path/result_$Date
    
    #第三步,发邮件
    mail -s "Rsync Backup $Date" 746620446@qq.com <  $Path/result_$Date
    
    #仅保存6个月的数据
    find $Path -type d -mtime +180 | xargs rm -f
    find $Path -type f -mtime +7 -name "result*" -exec rm -f {} ;
    

    注意一下,最后两行,第15行我们删除的是目录,最后一行我们删除的是文件,第15行实现了最后一个需求,至于最后一行是我们自行加的,毕竟,返回的校验值对我们来说也没有什么用处,保留7天就行了。

    至此,这个大案例就基本完成了,我们后面要做的就是其写入到定义任务当中,当把脚本写入到定时任务当中,还有很多优化的地方,还有,我们还要进行扩展,如果如果是20台客户端,当然我们不可能开20台虚拟机,起码还要再开一台进行尝试。

    脚本优化

    经过上面章节的讲解,我们已经写完了客户端和服务端的程序,下面就是优化一下了,我们写脚本的时候没有加存在性的判断,我们可以给它加上。

    客户端的脚本改进如下所示:

    [root@web1 scripts]# cat backup.sh 
    #第一步,定义变量
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    mkdir -pv $Path/$Dest && >/dev/null
    cd / && 
    [ -f $Path/$Dest/sys.tar.gz ] || tar czf $Path/$Dest/sys.tar.gz etc/hosts etc/fstab var/spool/cron/root && 
    [ -f $Path/$Dest/other.tar.gz ] || tar czf $Path/$Dest/other.tar.gz server/scripts/  && 
    [ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz > $Path/$Dest/flag && 
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path/ rsync_backup@192.168.80.200::backup
    
    #第五步,仅保存最近七天的数据
    find $Path -type f -mtime +7 | xargs rm -f
    

    服务端的脚本不用改进了:

    [root@BACKUP scripts]# cat backup.sh 
    #!/bin/bash
    
    #第一步,定义变量
    Path=/backup
    Date=$(date +%F)
    
    #第二步,进行校验
    md5sum -c $Path/*_$Date/flag > $Path/result_$Date
    
    #第三步,发邮件
    mail -s "Rsync Backup $Date" 746620446@qq.com <  $Path/result_$Date
    
    #仅保存6个月的数据
    find $Path -type d -mtime +180 | xargs rm -f
    find $Path -type f -mtime +7 -name "result*" -exec rm -f {} ;
    

    定时任务

    注意点:

    1. 至于定时任务的话,客户端肯定要首先执行,然后服务器才能执行,客户端凌晨一点执行,那么服务器就要凌晨3点执行,不管怎样,反正服务端要后执行。
    2. 定时任务要用绝对路径,而且要在脚本里面重新声明PATH变量。
    3. 去掉rsync的-v选项
    4. 将定时任务的产品的东西定位到/dev/null
    #第一步,定义变量
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    Host=$(hostname)
    Ip=$(hostname -I | cut -d' ' -f1)
    Date=$(date +%F)
    Dest=${Host}_${Ip}_${Date}
    Path=/backup
    
    #第二步,创建备份的目录
    [ -d /backup ] || mkdir /backup
    
    #第三步,打包压缩保存到/backup目录里面
    mkdir -p $Path/$Dest &>/dev/null
    cd / && 
    [ -f $Path/$Dest/sys.tar.gz ] || tar czf $Path/$Dest/sys.tar.gz etc/hosts etc/fstab var/spool/cron/root && 
    [ -f $Path/$Dest/other.tar.gz ] || tar czf $Path/$Dest/other.tar.gz server/scripts/  && 
    [ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz > $Path/$Dest/flag && 
    
    #第四步,定义rsync密码,将$path目录里面的文件推送到服务器的path模块当中
    export RSYNC_PASSWORD=1
    rsync -avz $Path/ rsync_backup@192.168.80.200::backup
    
    #第五步,仅保存最近七天的数据
    find $Path -type f -mtime +7 | xargs rm -f
    
    #!/bin/bash
    
    #第一步,定义变量
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    Path=/backup
    Date=$(date +%F)
    
    #第二步,进行校验
    md5sum -c $Path/*_$Date/flag > $Path/result_$Date
    
    #第三步,发邮件
    mail -s "Rsync Backup $Date" 746620446@qq.com <  $Path/result_$Date
    
    #仅保存6个月的数据
    find $Path -type d -mtime +180 | xargs rm -f
    find $Path -type f -mtime +7 -name "result*" -exec rm -f {} ;
    

    客户端定时任务:

    00 01 * * * /usr/bin/sh /server/scripts/backup.sh &> /dev/null 
    

    服务端定时任务:

    00 05 * * * /usr/bin/sh /server/scripts/backup.sh &>/dev/null
    

    在测试的时候,可以把时间写成这样:

    */1 *  * * *      #写成每分钟执行一次
    
  • 相关阅读:
    Makefile学习
    Tmux使用
    Linux进程管理学习资料
    Linux内存管理学习资料
    Python常用的软件包
    Docker 学习
    Intel处理器技术文档
    Firefly-RK3399笔记
    Linux Kernel API
    ARM 技术文档
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12107658.html
Copyright © 2011-2022 走看看