当前位置: 首页 > 编程日记 > 正文

inotify简介

一、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/bozong/p/4545474.html

相关文章:

链路层寻址与 ARP

一、 MAC 地址 不是主机或路由器具有链路层地址&#xff0c;而是它们的适配器&#xff08;即网络接口&#xff09;具有链路层地址。因此&#xff0c;具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址。 然而&#xff0c;链路层交换机并不具有与它们接口相关联的…

React 开始制作 6

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 从模拟开始 第1步&#xff1a;将UI分解为组件层次结构 不同的颜色为不同的组件&#xff0c; 第2步&#xff1a;在React中构建静态版本 第3步&#xff1a;确定UI状态的最小&#xff08;但完整&#xff…

php 空间类元素引入_引入单元素模式

php 空间类元素引入by Diego Haz迭戈哈兹(Diego Haz) 引入单元素模式 (Introducing the Single Element Pattern) 使用React和其他基于组件的库创建可靠的构建基块的规则和最佳实践。 (Rules and best practices for creating reliable building blocks with React and other …

Tcl学习之--列表|字典

【列表|字典】Tcl使用列表来处理各种集合&#xff0c;比方一个目录中的全部文件&#xff0c;以及一个组件的全部选项。最简单的列表就是包括由随意个空格、制表符、换行符、分隔的随意多个元素的字符串。比方: JerryAlice Mandy David l lindex命令: --> 获取元素 至少须要…

JAVA代码实现下载单个文件,和下载打包文件

//下载单个文件调用方法 /** * response * imgPath 下载图片地址 * fileName 保存下载文件名称 * date 2015年4月14日 下午5:53:24 */ public static void download(HttpServletResponse response,String imgPath,String fileName){ OutputStrea…

php读取本地xlsx格式文件的数据并按json格式返回

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 目的&#xff1a;php读取并操作本地xlsx格式的文件&#xff1b; 完整示例代码&#xff1a; 代码讲解&#xff1a;前端发起post网络请求&#xff0c;php接收一个name&#xff08;姓名&#xff09;的参数…

面向对象编程概念_如何向6岁的孩子解释面向对象的编程概念

面向对象编程概念by Alexander Petkov通过亚历山大佩特科夫(Alexander Petkov) Have you noticed how the same cliche questions always get asked at job interviews — over and over again?您是否注意到在求职面试中总是一遍又一遍地问同样的陈词滥调问题&#xff1f; I…

jQuery 属性

jQuery 属性 方法描述context在版本 1.10 中被废弃。包含被传递到 jQuery 的原始上下文jquery包含 jQuery 的版本号jQuery.fx.interval改变以毫秒计的动画运行速率jQuery.fx.off对所有动画进行全局禁用或启用jQuery.support包含表示不同浏览器特性或漏洞的属性集&#xff08;主…

mongodb的几种启动方法

1 mongodb的几种启动方法 启动Mongodb服务有两种方式&#xff0c;前台启动或者Daemon方式启动&#xff0c;前者启动会需要保持当前Session不能被关闭&#xff0c;后者可以作为系统的fork进程执行&#xff0c;下文中的path是mongodb部署的实际地址。1. 最简单的启动方式&#xf…

php 修改数据库表的字段的值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 php 前端传递参数&#xff0c;遍历数据库表的字段后根据条件进行修改。 <?phpheader("Content-Type:text/html;charsetutf8"); header("Access-Control-Allow-Origin: *"); //解…

如何开始使用PostgreSQL

by Akul Tomar通过Akul Tomar 如何开始使用PostgreSQL (How to get started with PostgreSQL) PostgreSQL is an open source Relational Database Management System (RDBMS). In this article, I’ll provide an introduction to getting started with PostgreSQL. Here is …

Java中数组常见的几种排序方法!

数组的定义&#xff1a; int[] arr new int[5];int[] arr1 {1,2,3,4,5};long[] arr2 new long[6];String[] strs new String[5];Person[] ps new Person[5]; 数组的操作&#xff1a; int[] arr {45, 34, 53, 43};Arrays.sort(arr);System.out.println(Arrays.toString(ar…

oracle 如何预估将要创建的索引的大小

一.1 oracle 如何预估将要创建的索引的大小 oracle 提供了2种可以预估将要创建的索引大小的办法&#xff1a; ① 利用包 Dbms_space.create_index_cost 直接得到 ② 利用11g新特性 Note raised when explain plan for create index 下边分别举例说明。 一.2 环境说明 [ora…

删除对象的某个属性

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 实现代码&#xff1a; var data {a:1,b:2,c:3}for(var item in data){if (item b) {delete data[item];} }console.log(data:, data) 打印结果&#xff1a; data: {a: 1, c: 3}

java 学到什么实习_我如何获得外展实习机会以及到目前为止所学到的知识

java 学到什么实习by Nguedia Adele由Nguedia Adele 我如何获得外展实习机会以及到目前为止所学到的知识 (How I got my Outreachy internship and what I’ve learned so far) I recently got accepted for an Outreachy internship, working with LibreHealth.我最近接受了与…

STM32F103C8开发板原理图和管脚图

转载于:https://www.cnblogs.com/libra13179/p/6894335.html

js实用数组方法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 判断是否为数组 1. Array.isArray([]) 2. var arr[1,2] arr instanceof Array -->true arr instanceof String -->false map ---- 返回数组得出的结果 const filtered [1, 2,…

BasicModal - 简单易用的现代 Web App 弹窗

BasicModal 是为现代 Web 应用程序打造的弹窗系统。它包括所有你需要显示的信息&#xff0c;问题或接收用户的输入。这里的弹窗还可以链接起来&#xff0c;所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框。无效输入可以使用包含突出显示和处理功能。 在线演示 …

javascript选择器_如何通过选择正确JavaScript选择器来避免沮丧

javascript选择器选择器如何影响代码的快速指南 (A quick guide on how selectors affect your code) While working on a project, I ran into an issue in my code. I was attempting to define multiple HTML elements into a collection and then change those elements ba…

Asp.net中GridView使用详解(引)【转】

Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中&#xff0c;编辑&#xff0c;取消&#xff0c;删除 GridView正反双向排序 GridView和下拉菜单DropDownList结合 GridView和CheckBox结合 鼠标移到GridView某一行时改变该行的背景色方法一 鼠标移到GridView…

《任正非:我若贪生怕死,何来让你们英勇奋斗》

非常高兴尼泊尔代表处的进步&#xff0c;你们的一个历史项目概算亏损&#xff0c;从大前年亏损2.7亿美金&#xff0c;到前年亏损3000万美金&#xff0c;到去年盈利2140万美金。在喜马拉雅南麓一路爬坡&#xff0c;辛苦了。听说去年你们都涨了工资&#xff0c;我十分高兴。巴西代…

个人使用微信支付

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 首先在PAYJS申请到商户号和密钥&#xff0c; 然后实现源码如下&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>…

构建node.js基础镜像_我如何使用Node.js构建工作抓取网络应用

构建node.js基础镜像by Oyetoke Tobi Emmanuel由Oyetoke Tobi Emmanuel 我如何使用Node.js构建工作抓取网络应用 (How I built a job scraping web app using Node.js) Scraping jobs from the web has now become easier thanks to Indreed.现在&#xff0c;借助Indreed&…

Robotium测试报告的生成方法(上)

7.1 使用junit-report生成报告 这个是参考网上的&#xff1a;http://www.xuebuyuan.com/2148574.html&#xff0c;经我个人验证是可行的方法&#xff0c;网上写的挺详细的&#xff0c;不过有些不太清楚明白的地方&#xff0c;鉴于网上说的有点迷茫&#xff0c;所以下面我再细化…

Python之向日志输出中添加上下文信息

除了传递给日志记录函数的参数&#xff08;如msg&#xff09;外&#xff0c;有时候我们还想在日志输出中包含一些额外的上下文信息。比如&#xff0c;在一个网络应用中&#xff0c;可能希望在日志中记录客户端的特定信息&#xff0c;如&#xff1a;远程客户端的IP地址和用户名。…

小程序点击图片自动播放视频,停止上一个视频播放

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 通过列表的点击事件自动播放列表对应的视频&#xff0c;同时停止上一个视频的播放 源码&#xff1a; <view><view classvv wx:for{{vedio_data}} wx:key><view classblock stylemargin…

hitchhiker部署_Hitchhiker的React Router v4指南:无限远的递归路径!

hitchhiker部署Welcome to the third part of the Hitchhiker’s Guide to React Router v4. In this article we’re going to focus on recursive paths. If you’ve missed the first two parts, you can find part 1 here and part 2 here.欢迎阅读《 Hitchhiker React Rou…

smbpasswd 和 pdbedit 的区别

smbpasswd 和 pdbedit 的区别 以前我们在windows上共享文件的话&#xff0c;只需右击要共享的文件夹然后选择共享相关的选项设置即可。然而如何实现windows和linux的文件共享呢&#xff1f;这就涉及到了samba服务了&#xff0c;这个软件配置起来也不难&#xff0c;使用也非常简…

DB天气app冲刺二阶段第十一天(完结)

今天最后一天冲刺了&#xff0c;明天就不再冲刺了。。已经把所有的技术的问题还有设计的问题都弄好了吧应该说 至少目前来说是的。因为有的实现不了的或者需要耗费时间的已经果断舍弃了&#xff0c;然后需要完善的也都基本完善了。 现在还需要做的就是素材的收集整理。需要抽半…

如何超越console.log并充分利用浏览器的调试控制台

by Gilad Dayagi通过吉拉德达亚吉 The console object is a very useful feature of browsers that has been around for many years. It provides access to the browser’s debugging console.Most web developers know how to print messages to the console using console…