在做环境治理时发现php服务的配置是单独存放在一个工程里的,在每次触发部署后,若该配置工程的代码有修改,则会重新拉代码。为了做环境的隔离,确保指定环境能够连接的指定的其他服务上,所以就需要能够自动修改配置文件中域名的。正常情况下,只需要写一个替换脚本后执行即可,但是由于代码会更新,会导致替换后的文件会在代码更新后被覆盖,考虑到每次去手动执行替换比较麻烦,遂想到使用脚本加crontab定时任务的方式处理。
监控文件变化
主要思路如下
- 保存需要监控文件的MD5值A到本地文件中
- 等待一段时间
- 重新计算文件的MD5得到B
- 比较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
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定时任务前,请先手动执行脚本,确保可正常执行后再保存
以上!