文件同步监控工具
2016-07-19 22:33
246 查看
文件监控同步工具
引言
最近开发中遇到了一个问题,多个人使用同一个测试机,又是同一时间开发,这样就不能用git去更新代码了,你要更新了代码别人的功能就被你覆盖了,
而一个取而代之的方法是通过
rz同步代码文件,但这效率太低了,而且有可
能复制错。
刚好之前做过fe开发,使用过百度的fisp,他的一个很重要的功能就是代码发
布,于是沿着这个思路做出了这个工具。
如何监控文件
这里面最大的问题就是解决如何监控文件了,成百上千的文件、文件夹如何高效的监控,我首先想到的还是php有没有这样的扩展,果不其然,找到了一个扩展类库
inotify,
他有
inotify_*()5个函数,但是功能太弱了让我大失所望,不能递归监控文
件夹,只能放弃使用php实现这个功能了。
沿着最开始的路线
inotify继续探索,找到了linux下面的命令
inotify-tools
,这个工具的功能就比较强大了,可以递归的监测文件夹及其子文件夹下面的文件
,于是就用shell实现了一个文件监控同步工具,预知具体细节,请继续往下看,
问题一个个的解决
如何将文件保存到服务器
这个借鉴了fisp的设计,在服务器上边放一个接受文件的脚本,通过http的方式
将文件和要保存的地方发送给脚本,脚本进行保存,然后返回结果。
这个方法的优点很明显:在互联网公司,web服务一般都是有部署的,直接将脚本放上去
配置好目录权限,就可以用了,简单方便。
下面是服务端脚本的php代码
<?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.'; }
实现
监控也有了,上传文件也有了,接下来就是具体的实现了:![](https://images2015.cnblogs.com/blog/675818/201607/675818-20160719222223560-2146345321.png)
首先就是解析运行脚本时候的参数,看看是否全量发布,是否监控,以及指定的服务器。
发布,发布这里原理很简单,但实际实现的时候很麻烦,从监控的文件夹中最长匹配路径,
搜索、拼接路径,然后通过curl发布。
监控,监控用了管道命令,让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定义了发布的服务器名称和地址
使用示例
![](https://images2015.cnblogs.com/blog/675818/201607/675818-20160719221552826-1916642838.gif)
命令
-d | --dest-server是指定服务器名称,后边的发布就会发布到该服务器,
-a | --all
会将所有的文件发布一边,
-w | --watch会监控所有的文件,有改动进行发布,
-h | --help是查看帮助
github地址
watch-callback-file欢迎一起改进优化
参考文章&记录笔记
字符串截取相关文章推荐
- centos7下使用yum安装mysql
- 配置openCV出错
- docker10件事
- linux日志
- Linux系统虚拟机安装
- Linux搭建DNS服务器
- CentOS 安装 升级Firefox
- CentOS 7 下挂载NTFS文件系统并实行开机自动挂载
- 通过流量复制解决某个服务节点无响应的问题
- 最详细的整个Spark运行时的内核架构以及架构思考
- 关于nohup重定向日志按日期区分文件(未解决)
- linux下openocd+JLink下载程序到stm32
- Linux文件权限设置
- Apache Solr入门教程(初学者之旅)
- xshell下常用命令
- Hadoop笔记四之Hdfs文件读写操作
- Centos6.7安装Apache2.4+Mysql5.5+Apache2.4
- Linux的共享库so
- CentOS 7 VM下修改网卡名为eth0并启动问题解决
- Linux下几款C++程序中的内存泄露检查工具