shell脚本判断文件是否改变

在做环境治理时发现php服务的配置是单独存放在一个工程里的,在每次触发部署后,若该配置工程的代码有修改,则会重新拉代码。为了做环境的隔离,确保指定环境能够连接的指定的其他服务上,所以就需要能够自动修改配置文件中域名的。正常情况下,只需要写一个替换脚本后执行即可,但是由于代码会更新,会导致替换后的文件会在代码更新后被覆盖,考虑到每次去手动执行替换比较麻烦,遂想到使用脚本加crontab定时任务的方式处理。

监控文件变化

主要思路如下

  1. 保存需要监控文件的MD5值A到本地文件中
  2. 等待一段时间
  3. 重新计算文件的MD5得到B
  4. 比较A和B,若A=B则退出,若A不等于B,则执行替换逻辑
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/bin/bash
    cd `dirname $0`
    echo 当前目录:`pwd`
    now_time=`date`
    echo "运行时间为${now_time}" >> crontab_replace.log 2>&1
    #md5值改变后需要执行的脚本
    sh_file=replaceDomain.sh
    #需要监控的文件
    file_name=test.txt
    # 记录 md5值的文件
    md5=.file_md5.info
    # 创建新的md5信息
    file_md5_new=$(md5sum -b $file_name | awk '{print $1}'|sed 's/ //g')
    # 创建md5的函数
    function creatmd5()
    {
    echo $file_md5_new > $md5
    }
    # 判断文件是否存在
    if [ ! -f $md5 ] ; then
    echo "md5file is not exsit,create md5file......." >> crontab_replace.log 2>&1
    creatmd5
    echo "md5file create finish!" >> crontab_replace.log 2>&1
    exit
    fi

    # 读取旧的md5信息
    file_md5_old=$(cat $md5|sed 's/ //g')

    echo $file_md5_new >> crontab_replace.log 2>&1
    echo $file_md5_old >> crontab_replace.log 2>&1

    # 对象对比判断
    if [ "$file_md5_new" == "$file_md5_old" ];then

    echo "md5 is not changed">> crontab_replace.log 2>&1
    exit
    else
    echo "md5 is changed" >> crontab_replace.log 2>&1
    sh ${sh_file} >> crontab_replace.log 2>&1
    creatmd5
    fi

创建crontab

切换到需要执行任务的用户下,执行

1
crontab -e

输入定时规则及需要执行脚本的地址后保存即可!

注意: 在设置crontab定时任务前,请先手动执行脚本,确保可正常执行后再保存
以上!

投食