写点什么

inotifywait+rsync 实现目录监听及同步

用户头像
慢慢de
关注
发布于: 2021 年 04 月 09 日

解决 Win10 下 docker 通过目录挂载的项目访问慢的问题

方案一:在生成容器时加 cached 参数


例如:docker run -d -p 9000:9000 –name php-dubbo-cache ==-v /Users/admin/Site:/data/:cached== php-fpm

经尝试,此方案并没有解决我当前的问题,访问仍然很慢,环境:win10+docker(nginx+php-fpm)


方案二:使用 inotifywait + rsync 实现监控目录内变化并同步到其他目录


2.1 rsync

rsync 可实现本地目录同步、本地+远程服务器内容同步等功能,本次我们使用 Local => Local 模式的目录同步


// 2.1.1 安装 rsyncyum -y install rsync
// 2.1.2 rsync 常用参数-a,--archive(存档) 归模式,表示以递归的方式传输文件,并且保持文件属性,等同于加了参数-rlptgoD
-r,–recursive 对子目录以递归模式处理
-l,--links 表示拷贝链接文件
-p , --perms 表示保持文件原有权限
-t , --times 表示保持文件原有时间
-g , --group 表示保持文件原有属用户组
-o , --owner 表示保持文件原有属主
-D , --devices 表示块设备文件信息
-z , --compress 表示压缩传输
-H 表示硬连接文件
-A 保留ACL属性信息
-P 显示传输进度
复制代码


示例

本次使用 rsync 简单的本地目录同步


rsync -a /var/www/test_dir_1 /var/www/test_dir_2
复制代码


此次命令会带来如下结果

将 /var/www/test_dir_1/ 目录下的所有文件及目录完整同步到 /var/www/test_dir_2/ 目录下

2.2 inotify

inotify-tools 提供两种工具,一个是 inotifywatch,用来统计文件系统访问的次数;另一个就是我们要用的 inotifywait,用来监控文件或目录的变化


// 2.2.1 检查是否支持 inotifyll /proc/sys/fs/inofity/[root@6dcde9161cb0 test_dir_1]# ll /proc/sys/fs/inotify/total 0-rw-r--r-- 1 root root 0 Apr  9 01:58 max_queued_events-rw-r--r-- 1 root root 0 Apr  9 01:58 max_user_instances-rw-r--r-- 1 root root 0 Apr  9 01:58 max_user_watches
说明:max_queued_evnets,表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。max_user_instance,表示示每一个real user ID可创建的inotify instatnces的数量上限。max_user_watches,表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo 30000000 > /proc/sys/fs/inotify/max_user_watches
有如上输出则表示支持,否则需要重新编译 linux 内核,方法请自行百度~
// 2.2.2 检查是否已经安装rpm -qa inotify-tools
// 2.2.3 安装// 直接安装 inotify-tools 可能会提示找不到源,需要先安装 epel 源,再安装 inotify-toolsyum -y install epel-releaseyum -y install inotify-tools
// 2.2.4 常用参数–fromfile 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。-m, –monitor接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。-d, –daemon跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。-o, –outfile 输出事情到一个文件而不是标准输出。-s, –syslog输出错误信息到系统日志-r, –recursive监视一个目录下的所有子目录。-q, –quiet指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。–exclude 正则匹配需要排除的文件,大小写敏感。–excludei 正则匹配需要排除的文件,忽略大小写。-t , –timeout 设置超时时间,如果为0,则无限期地执行下去。-e , –event 指定监视的事件。-c, –csv输出csv格式。–timefmt 指定时间格式,用于–format选项中的%T格式。–format 指定输出格
复制代码


示例


inotifywait -mrq /var/www/test_dir_1// 开启监听后,目录内的变化会被 inotifywait 捕获并打印[root@6dcde9161cb0 www]# inotifywait -mrq ./test_dir_1/./test_dir_1/ OPEN,ISDIR./test_dir_1/ ACCESS,ISDIR./test_dir_1/ CLOSE_NOWRITE,CLOSE,ISDIR./test_dir_1/ OPEN,ISDIR./test_dir_1/ ACCESS,ISDIR./test_dir_1/ CLOSE_NOWRITE,CLOSE,ISDIR./test_dir_1/ OPEN test2.php./test_dir_1/ MODIFY test2.php./test_dir_1/ CLOSE_WRITE,CLOSE test2.php
复制代码


2.3 实施


// 我们使用 inotifywait + rsync 来实现docker容器挂载的项目目录同步到容器内非挂载目录,// 以达到容器内的 nginx 服务使用容器本地目录,且 windows 本地修改实时更新容器内本地项目目录的目的// 最终解决容器内挂载项目目录访问慢的问题// 2.3.1 先touch inotifywait_rsync.shvim inotifywait_rsync.sh// 写入如下脚本#!/bin/bashinotifywait -mrq -e create,delete,modify,attrib,move,close_write "/sourcecode" | while read event ; do        rsync -a /sourcecode /var/www/done
复制代码


==注意:== inotifywait 监控变化事件后的同步,会在目标目录下创建一个来源目录,跟单独用时不太一样,所以这里我们用 /var/www/ 的写法,最终同步后回事 /var/www/sourcedoe/ 的形式


==提醒:== 为了不改 nginx 配置文件,可以设置挂载目录为其他目录,如/home/www,然后将 /sourcecode 作为本地目录使用


参考文档-安装:https://blog.csdn.net/leadseczgw01/article/details/106542704


参考文档-rsync 参数:https://blog.csdn.net/bodybo/article/details/82746601


参考文档-组合:https://blog.csdn.net/helloxiaozhe/article/details/97038443


参考文档-rsync 配置详解:https://blog.csdn.net/weixin_33785972/article/details/92526442


参考文档-rsync --partial 选项说明:https://blog.csdn.net/weixin_34342992/article/details/86060476

用户头像

慢慢de

关注

唯有变化是永恒。 2019.03.20 加入

把更多的精力放到更重要的事情上。

评论

发布
暂无评论
inotifywait+rsync实现目录监听及同步