inotify文件事件的自动化部署

  • 需要安装,补充inotify命令inotify-tools,inotifywait.

    1
    sudo apt-get(yum) install inotify-tools
  • inotifywait -h 了解其使用方法

基于文件事件的自动化部署

  • 1.需求: 由于公司所有服务器采用跳板机(jumpserver)登录方式,目前无法通过任何方式进行直连以及文件的直接传输,于是乎,程序更新部署(尤其是测试环境)显得及其麻烦.当前只能通过将程序文件上传(ftp)到目的服务器临时目录 /tmp,然后再进行二次操作.
  • 2.解决方案: 考虑二次操作,有几个解决方案,其中2个比较代表性的是:
    • 2.1 通过supervisord配置,界面管理重启.
    • 2.2 通过文件监听inotifywait自己实现监听重启脚本
  • 3.方案对比
    • 3.1 supervisord劣势: 需要额外的配置文件,需要开放管理界面端口,(根据以往的经验,)容易失效
    • 3.2 supervisord优势: 界面管理,可以随时重启当前服务
    • 3.3 inotifywait劣势: 每次重启需要手动出发事件(相当于去supervisord界面点击一下),但是要通过jumpserver的界面去操作,中间多了好几步.
    • 3.4 inotifywait优势: 安装简单(就是一个安装命令和一个监听脚本),根据自己的服务特性写脚本足够灵活(不必重复的配置文件)

微服务配置脚本

由于完全自己开发,所有的脚本,配置格式都比较统一,所以脚本不会复杂

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
43
44
#!/usr/bin/env bash

# 监听文件夹改动并自动编译重启
SRCDIR=`pwd`
dorestart(){
sleep 2
echo "restart $1"
cd "/srv/onevideo/$1"
f="1v1_$1"
tmpfile="/tmp/onevideo/$1/$f"
if [ ! -f $tmpfile ]; then
return
fi
setsid sh restart.sh &
# mv $tmpfile ./
# chmod +x $f
# ps -aux|grep $f|grep -v grep|awk '{print $2}'|xargs kill -15 # 2|3|15
# sleep 2
# dt=`date "+%m%d_%H%M"`
# if [ ! -d logs_bak ]; then
# mkdir logs_bak
# fi
# mv "$1.log" "logs_bak/$1"_"$dt.log"
# setsid nohup ./$f -c "server.yaml" --registry_address "127.0.0.1:8500" 2>&1 >>"$1.log" &
cd $SRCDIR
if [ ! -f "$1/EOF" ]; then
touch "$1/EOF"
fi
# setsid sh restart.sh &
echo "restart $1 done"
}

# 这里 format 定义输出的日志格式, read类似程序里的scan(将输入读取到指定变量的意思)
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %Xe %w %f' \
-e DELETE,CREATE --excludei *.* $SRCDIR/* | while read DATE TIME EVENT DIR FILE; do
RDIR=${DIR%/}
dir=${RDIR##*/}
echo "notify $EVENT:$dir-$FILE"
# if [ "CLOSE_WRITEXCLOSE" == "$EVENT" ] #CLOSE事件不止一次发生,并且暂时不知道怎么判断文件上传结束
if [ "EOF" == "$FILE" ] # 通过EOF文件标记上传结束
then
dorestart $dir
fi
done
  • 说明: 略
  • 操作: 每次上传完新程序文件,只需要删除对应目录下(自动生成的)EOF文件即可重启
  • 执行: 不用 -d的原因是 -d -o 执行的时候出现了问题(提示日志文件权限之类的,没有细查…)

为什么不监听文件上传完成后重启

  1. 大文件断续上传,会产生好几个CREATE\CLOSE事件,不好判断(主要是我也不会)文件是否真的完整上传完成.
  2. 上传时就在同一个目录下,删除一个EOF文件足够简单.并且这样还可以支持无更新重启(虽然上面脚本没支持)
  3. 动作缓冲,潜意识提醒你检查服务状态^0_0*