文件同步监控工具

文件监控同步工具

引言

最近开发中遇到了一个问题,多我的使用同一个测试机,又是同一时间开发
,这样就不能用git去更新代码了,你要更新了代码别人的功能就被你覆盖了,
而一个取而代之的方法是经过rz同步代码文件,但这效率过低了,并且有可
能复制错。php

恰好以前作过fe开发,使用过百度的fisp,他的一个很重要的功能就是代码发
布,因而沿着这个思路作出了这个工具。html

如何监控文件

这里面最大的问题就是解决如何监控文件了,成百上千的文件、文件夹如何高效的监控,
我首先想到的仍是php有没有这样的扩展,果不其然,找到了一个扩展类库inotify
他有inotify_*()5个函数,可是功能太弱了让我大失所望,不能递归监控文
件夹,只能放弃使用php实现这个功能了。linux

沿着最开始的路线inotify继续探索,找到了linux下面的命令inotify-tools
,这个工具的功能就比较强大了,能够递归的监测文件夹及其子文件夹下面的文件
,因而就用shell实现了一个文件监控同步工具,预知具体细节,请继续往下看,
问题一个个的解决nginx

如何将文件保存到服务器

这个借鉴了fisp的设计,在服务器上边放一个接受文件的脚本,经过http的方式
将文件和要保存的地方发送给脚本,脚本进行保存,而后返回结果。git

这个方法的优势很明显:在互联网公司,web服务通常都是有部署的,直接将脚本放上去
配置好目录权限,就能够用了,简单方便。github

下面是服务端脚本的php代码web

<?php
@error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
function mkdirs($path, $mod = 0777) {
    if (is_dir($path)) {
        return chmod($path, $mod);
    } else {
        $old = umask(0);
        if(mkdir($path, $mod, true) && is_dir($path)){
            umask($old);
            return true;
        } else {
            umask($old);
        }
    }
    return false;
}
if($_POST['to']){
    $to = urldecode($_POST['to']);
    if(is_dir($to) || $_FILES["file"]["error"] > 0){
        header("Status: 500 Internal Server Error");
    } else {
        if(file_exists($to)){
            unlink($to);
        } else {
            $dir = dirname($to);
            if(!file_exists($dir)){
                mkdirs($dir);
            }
        }
        echo move_uploaded_file($_FILES["file"]["tmp_name"], $to) ? 0 : 1;
    }
} else {
    echo 'I\'m ready for that, you know.';
}

实现

监控也有了,上传文件也有了,接下来就是具体的实现了:shell

  1. 首先就是解析运行脚本时候的参数,看看是否全量发布,是否监控,以及指定的服务器。
  2. 发布,发布这里原理很简单,但实际实现的时候很麻烦,从监控的文件夹中最长匹配路径,
    搜索、拼接路径,而后经过curl发布。
  3. 监控,监控用了管道命令,让inotify-tools一直等待,有修改就传递给管道后面的程序,
    管道后面的程序进行发布。

例子

在使用以前必定要确保安装了inotify-tools,监控依赖于这个软件中inotifywait功能,
通常能够直接使用yum install inotify-tools安装该软件数组

我使用的一个小例子,首先必须能存在的是配置文件,config.sh服务器

declare -A paths uploads
paths[actions]=/usr/local/nginx/html/actions/
paths[controllers]=/usr/local/nginx/html/controllers/
uploads[test1]="http://10.211.55.3/receiver.php"
uploads[test2]="http://10.211.55.3/receiver.php"

paths数组的键值定义了监控的文件夹名称,uploads定义了发布的服务器名称和地址

使用示例

命令 -d | --dest-server 是指定服务器名称,后边的发布就会发布到该服务器,-a | --all
会将全部的文件发布一边,-w | --watch会监控全部的文件,有改动进行发布,-h | --help是查看帮助

github地址

watch-callback-file
欢迎一块儿改进优化

参考文章&记录笔记

  1. 字符串截取
相关文章
相关标签/搜索