inotify用法简介及结合rsync实现主机间的文件实时同步

一、inotify简介

 

inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。

 

inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。

 

inotify 可以监视的文件系统常见事件包括:

IN_ACCESS:文件被访问

IN_MODIFY:文件被修改

IN_ATTRIB,文件属性被修改

IN_CLOSE_WRITE,以可写方式打开的文件被关闭

IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭

IN_OPEN,文件被打开

IN_MOVED_FROM,文件被移出监控的目录

IN_MOVED_TO,文件被移入监控着的目录

IN_CREATE,在监控的目录中新建文件或子目录

IN_DELETE,文件或目录被删除

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

 

通过/proc接口中的如下参数设定inotify能够使用的内存大小:

1、/proc/sys/fs/inotify/max_queue_events

应用程序调用inotify时需要初始化inotify实例,并时会为其设定一个事件队列,此文件中的值则是用于设定此队列长度的上限;超出此上限的事件将会被丢弃;

2、/proc/sys/fs/inotify/max_user_instances

此文件中的数值用于设定每个用户ID(以ID标识的用户)可以创建的inotify实例数目的上限;

3、/proc/sys/fs/inotify/max_user_watches

此文件中的数值用于设定每个用户ID可以监控的文件或目录数目上限;

 

 

二、inotify-tools

 

inotify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。它由Rohan McGovern开发,其项目网址为http://inotify-tools.sourceforge.net。

 

inotify-tools提供的两个命令行工具:

inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。

inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

 

 

inotifywait命令使用简介:

inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:

-m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;

-r, --recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。

-e <event>, --event <event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;

--timefmt <fmt>:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';

--format <fmt>:自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:

      %w:显示被监控文件的文件名;

      %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;

      %T:使用--timefmt选项中自定义的时间格式;

 

例如,要监控/tmp/test目录及其内部所有文件上发生的create,delete,modify,close_write事件,则使用如下命令:

# inotify -r --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/test

 

此命令在监控到某文件上第一次事件后就会退出,如果想一直监控,则需要为命令添加-m选项。

 

在很多场景中都会用到将某主机上的某目录下的所有文件改变实时同步至另一主机上的指定位置,这也可以通过在脚本中使用inotifywait结合rsync命令来实现,比如如下脚本:

 

#!/bin/bash

 

DESTHOST=172.16.100.6

DESTHOSTDIR=/www/htdocs/

SRCDIR=/www/htdocs/

 

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f'  \

-e create,delete,modify,attrib  $SRCDIR | while read DATE TIME DIR FILE; do

   $FILECHANGE=${DIR}${FILE}

 

   rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && \

      echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log

 

done

 

需要注意的是,此脚本中的rsync是通过ssh加密后进行文件传输的,因此需要事先配置好相应的ssh能够基于密钥对用户进行认证,以免每一次文件同步都需要用户手动输入密码。

 

当然,如果数据传输不需要加密,此处也可以通过在目录主机的启动rsyncd守护进程来实现。

 

三、配置rsyncd+inotify实现文件实时同步:

 

本案例实现监控原主机上指定目录中的所有文件变化,并将变化实时同步至目标主机的指定目录中;所用主机及相关目录如下:

源主机:RHEL5.4(x86),172.16.100.1, 文件所在的目录为/www/htdocs;

目标主机:RHEL5.4(x86),172.16.100.6, 文件所在的目录为/www/htdocs;

 

1、设定目标主机(本例为172.16.100.6)

 

本案例中采用基于rsync守护进程的方式进行数据同步,其数据传输过程是明文方式,因此只适用于在特定的场景中应用。

 

1)安装相关软件:

目标主机是接收别的主机发送来的文件的服务器,因此,其rsync需要以守护进程的方式工作。rsync服务通常基于超级守护进程xinetd管理的方式来实现,因此需要事先安装rysnc和xinetd:

# yum -y install rsync xinetd

 

2)为rsync提供配置文件/etc/rsyncd.conf,内容类似如下内容:

# Section 1: Global settings

uid = nobody

gid = nobody

use chroot = no

max connections = 3

strict modes = yes

pid file = /var/run/rsyncd.pid

log file = /var/log/rsyncd.log

# Section 2:Directory to be synced

[htdocs]

path = /www/htdocs

ignore errors = yes

read only = no

write only = no

hosts allow = 172.16.0.0/16

hosts deny = *

list = false

uid = root

gid = root

auth users = wwwuser

secrets file = /etc/rsync.passwd

 

其中的相关指令及其说明可以通过rsyncd.conf的手册而获取。而其访问控制功能也可基于xinetd进行,具体方法请参照xinetd.conf的手册页。

 

3)提供secrets file所指定的口令文件/etc/rsync.passwd,其内容类似如下:

htdocsuser:passwOrdForhtdOcs

 

其中冒号前的是用户名,冒号后的是对应用户的密码。此文件不能为其他任意用户可访问,因此可用如下命令修改:

# chmod 600  /etc/rsync.passwd

 

4)配置服务可以开机启动:

# chkconfig rsync on

# chkconfig xinetd on

# service xinetd start

 

默认情况下,rsyncd监听的端口为873/TCP,这可以通过如下命令查看:

# netstat -tnlp | grep ":873"

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      3653/xinetd

 

2、设定源主机

 

1)安装相关软件

源主机需要实时监控指定目录中的所有文件上与文件改变相关的事件,并在事件发生时将改变的数据同步至目录主机,因此,源主机上需要确保内核支持inotify,并安装inotify-tools和rsync。

 

rsync的安装参照目标主机的中的方式进行即可。

 

inotify-tools的安装可以基于源码编译的方式进行,也可以通过安装其rpm进行。

源码下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

rpm包下载页面:http://rpm.pbone.net/index.php3/stat/4/idpl/15265939/dir/redhat_el_5/com/inotify-tools-3.14-1.el5.i386.rpm.html

 

这里以编译源代码的方式演示安装过程:

# tar xf inotify-tools-3.14.tar.gz

# cd inotify-tools-3.14

# ./configure

# make

# make install

# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

# ldconfig

 

2)为源主机的rsync提供通过htdocsuser用户同步文件至目标主机的口令文件

# echo 'passwOrdForhtdOcs' > /etc/rsync.passwd

# chmod 600 /etc/rsync.passwd

 

注意,对于RHEL5.4自带的2.6.8版本的rsync来说,其客户端(即此处的源主机上的rsync)的口令文件中只能保存用户的口令,而不能类似目标主机上可同时指定用户名。

 

3)建立脚本/root/bin/htdocsync.sh,通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步过程:

#!/bin/bash

#

DESTHOST=172.16.100.6

DESTHOSTDIR=/www/htdocs/

SRCDIR=/www/htdocs/

 

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR |  while read DATE TIME DIR FILE; do

 

       FILECHANGE=${DIR}${FILE}

 

       rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && \

       echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log

done

 

而后给此脚本执行权限,并执行即可:

# chmod u+x /root/bin/htdocsync.sh

# /root/bin/htdocsync.sh &

 

如果想让此功能可以在开机时自动启动,则可以通过如下方式进行:

# echo '/root/bin/htdocsync.sh &' >> /etc/rc.d/rc.local

 

补充说明:如果您期望将源主机上的数据同步至多台目标主机,对每个目标主机均类似上面的目标主机的设定方法进行设定即可。

转载于:https://www.cnblogs.com/wjoyxt/p/4440968.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转] 64位windows下添加postgreSQL odbc数据源

系统环境&#xff1a;windows7 64位 postgreSQL9.0&#xff08;64bit)ps&#xff1a;安装postgreSQL时确定安装了odbc驱动。问题&#xff1a;点击“开始-》控制面板-》管理工具-》数据源&#xff08;ODBC&#xff09;-》用户DSN-》添加”&#xff0c;未出现postgreSQL关联选项。…

Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

1 试用了MysqlWorkBench的数据迁移功能 以为能实现&#xff1a;建立跟Sqlserver一样的表结构和视图的功能&#xff0c;sqlserver的数据迁移到mysql 实际上发现&#xff1a;即使勾选了表和视图&#xff0c;实际上却只能建立表结构。 视图结构&#xff0c;表数据&#xff0c;都没…

vscode 默认初始化_Visual Studio Code(vscode)使用介绍

[TOC]vscode 安装软件直接在vscode官网&#xff08;https://code.visualstudio.com/&#xff09;下载安装。建议将下图红框中勾选&#xff0c;安装完成后可通过鼠标右键打开vscode。安装界面使用介绍插件安装安装完成后&#xff0c;左侧栏可以看到不同模块&#xff0c;一开始包…

梯度下降法分析

梯度下降法存在的问题 梯度下降法的基本思想是函数沿着其梯度方向增加最快&#xff0c;反之&#xff0c;沿着其梯度反方向减小最快。在前面的线性回归和逻辑回归中&#xff0c;都采用了梯度下降法来求解。梯度下降的迭代公式为&#xff1a; \(\begin{aligned} \theta_j\theta_j…

PHP程序员的技术成长规划

2019独角兽企业重金招聘Python工程师标准>>> 按照了解的很多PHP/LNMP程序员的发展轨迹&#xff0c;结合个人经验体会&#xff0c;抽象出很多程序员对未来的迷漫&#xff0c;特别对技术学习的盲目和慌乱&#xff0c;简单梳理了这个每个阶段PHP程序员的技术要求&#…

flink 入门

http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me/blog/2016/05/09/flink-internals-understanding-execution-resources/ 要了解一个系统&#xff0c;一般都是从架构开始。我们关心的问题是&#xff1a;系统部署成功后…

mybatis 多租户saas_彻底理解微商城多租户Saas架构设计

原文链接&#xff1a;https://blog.csdn.net/haponchang/article/details/104246317&#xff0c;感谢作者提供这么好的总结&#xff01;1.具体的SaaS架构必须1.先仔细选择最适合应用程序需求的租户模型&#xff0c;2.需要根据租户模型来选定最终的架构&#xff0c;即应用程序设…

MPU和MCU的区别和选择

当为你的下一个设计方案选择正确的核心处理器件时&#xff0c;你应该考虑哪些因素呢?本文将对MPU和MCU做些对比分析&#xff0c;并以此对器件的选择给出一些指导性建议和意见。 本文引用地址&#xff1a;http://www.eepw.com.cn/article/164617.htm 每当在为新设计选择正确合理…

html表单(一)

在网上找的各种关于表单元素的解释都有些bug&#xff0c;最后还是去官网上看的文档再结合各个问答网站的内容作出如下总结&#xff0c;先给出官网表单元素这章的链接&#xff1a;http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#forms 待续转载于:https://www.cnblo…

Python模块——subprocess

subprocess模块 通过Python去执行一条系统命令或脚本。 三种执行命令的方法 subprocess.run(*popenargs, inputNone, timeoutNone, checkFalse, **kwargs) #官方推荐 subprocess.call(*popenargs, timeoutNone, **kwargs) #跟上面实现的内容差不多&#xff0c;另一种写法 sub…

bulter机器人_科普!九款使用率最高的物流机器人大盘点!

原标题&#xff1a;科普&#xff01;九款使用率最高的物流机器人大盘点&#xff01;说起快递的速度&#xff0c;中国可谓是跑在全球前列&#xff0c;因为强大的人力资源以及完善的供应链结构&#xff0c;导致整个运作过程很流畅快速。但是&#xff0c;如果在特殊的节点&#xf…

异步传参

2019独角兽企业重金招聘Python工程师标准>>> AJAX样板 $.ajax ({ type:"post", url:"要传递参数的地址", data:{id:id}, success:function(val) { …

PHP实现单击“添加”按钮增加一行表单项,并将所有内容插入到数据库中

PHP实现单击“添加”按钮增加一行表单项&#xff0c;并将所有内容插入到数据库中 效果图: htmljquery: <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script language"javascript&qu…

Leetcode按Tag刷题

按照Leetcode的Tag来刷题&#xff0c;从easy到hard刷题 关于如何让Leetcode按难易程度排序&#xff0c;可按以下步骤&#xff1a; 1. 进入Leetcode后&#xff0c;点击code 2.点击code后&#xff0c;可查看所有题目&#xff0c;可看到右下角有Tag标志&#xff0c;选择想要刷的T…

JMeter学习(三十一)Access Log Sampler

前提&#xff1a; 在tomcat\conf\server.xml默认情况下&#xff0c;会有一段代码&#xff1a; <Valve className"org.apache.catalina.valves.AccessLogValve" directory"logs" pattern"%h %l %u %t &quot;%r&quot; %s %b" prefix&qu…

布谷鸟沙盒分析静态文件_“案例沙盒方法”喜提国际商学院协会(AACSB)2019年启发式创新奖...

国际商学院协会(AACSB)于2019年4月14日至16日在英国爱丁堡召开年会&#xff0c;会上公布了2019年Innovation that Inspire的(启发式创新奖)获奖学校及项目。大会共收到800余个项目报名&#xff0c;最终21个项目获此殊荣。新南威尔士大学商学院以创新品牌UNSW Sandbox Method (案…

淘宝npm镜像使用方法(转)

1.临时使用 npm --registry https://registry.npm.taobao.org install express 2.持久使用 npm config set registry https://registry.npm.taobao.org 配置后可通过下面方式来验证是否成功 npm config get registry或 npm info express3.通过cnpm使用 npm install -g cnpm --r…

Console.Write(程序猿?开发?写代码?编程?移动、网页、桌面开发?Oh,我连菜鸟都不是!);...

You make choices and dont look back. 虽然不是学计算机出身&#xff0c;但我对于写代码充满了好奇&#xff0c;尽管这种兴趣还不像烈酒那样浓烈&#xff0c;也不能像打鸡血似的刺激自己每个神经元而浑身激情&#xff0c;而熊猫眼的熬夜。但现在也一如既往的坚持&#xff0c;坚…

基本动态规划问题

小东所在公司要发年终奖&#xff0c;而小东恰好获得了最高福利&#xff0c;他要在公司年会上参与一个抽奖游戏&#xff0c;游戏在一个6 * 6的棋盘上进行&#xff0c;上面放着36个价值不等的礼物&#xff0c;每个小的棋盘上面放置着一个礼物&#xff0c;他需要从左上角开始游戏&…

还有前景吗_喷码机行业还有前景吗 2021喷码机市场份额有多大

喷码机按照其实现的方式不同又分为&#xff0c;压电喷墨技术、压阀式喷墨技术、和热发泡喷墨技术(Thermal Inkjet Technolog)&#xff0c;简称TIJ。根据以上原理可以将喷码机分为&#xff1a;小字符喷码机&#xff0c;大字符喷码机&#xff0c;高清晰喷码机。喷码机是运用带电的…