默认情况下inotifywait 监控到对应的umount事件之后会退出, 因为我们要批量的监控,所以当然不能因为一个挂载点的umount就退出 inotifywait, 所以需要在umount触发后继续监控 鄙人的解决思路如下: 要想让 inotifywait 可以持续的监控unmount, 那么最好就是 发生了unmount之后,触发 对应的mount事件,这时候inotifywait将会自动退出,确保成功 然后再次启动inotifywait 进行监控。 大致的流程如下: 获取inotifywait结果文件的修改日期, 记录为 m1 启动inotifywait进行监控,并获取其进程pid,记录为p1(如果以 -d 方式启动,那么路径都必须用绝对路径) sleep BUG: 在终止当前的inotifywait,mount 丢失的挂载点,到再次成功启动inotifywait,这个时间段如果发生了unmount,那么是记录不到的 本文原创,转载请注明出处!
实际上,上面描述的问题不是inotify的缺陷,而是inotify-tools包中inotifywait工具的缺陷。inotifywait的man文档中也给出了这个bug说明。 该方法是将inotifywait得到的事件记录到文件/etc/inotifywait.log中,然后在死循环中判断该文件,如果该文件不为空则调用一次rsync进行同步,同步完后立即清空inotifywait.log 但需要考虑一种情况,inotifywait可能会不断地向inotifywait.log中写入数据,清空该文件可能会使得在rsync同步过程中被inotifywait监控到的文件被rsync遗漏,所以在清空该文件后应该再调用一次 如果没有监控到事件,inotifywait.log将是空文件,此时循环将睡眠1秒钟,所以该脚本并不是百分百的实时,但1秒钟的误差对于cpu消耗来说是很值得的。 另外,脚本中inotifywait命令中的后台符号"&"绝不能少,否则脚本将一直处于inotifywait命令阶段,不会进入到下一步的循环阶段。
使用inotify-tools 工具实时监控系统事件监控 inotify-tools http://linux.die.net/man/1/inotifywait inotify-tools 下载地址 downloads.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz 监控脚本: # cat file_file_inotifywait.sh /bin/sh inotifywait=/usr/local/bin/inotifywait monitor_dir=/opt/web/ $inotifywait -mr \ -e create
背景 可以使用inotifywait命令来监控文件系统事件,包括文件新增和减少,以及文件名和文件路径的变化。 : 要监控文件新增事件: inotifywait -m /path/to/directory -e create 要监控文件减少事件: inotifywait -m /path/to/directory -e delete 要监控文件名或文件路径的变化: inotifywait -m /path/to/directory -e attrib 比如只监控文件的创建,删除,移动(文件名和路径)等,然后使用 /bin/bash # 监控的目录 WATCH_DIR="/path/to/directory" # 监控目录变化,并执行指定命令 inotifywait -m -r -e create,delete 监控文件变化事件 inotifywait -e modify,move,create,delete "$file" 2>/dev/null # 备份原文件到指定目录
inotify命令介绍 inotify-tools 包含了两个命令:inotifywait 与 inotifywatch。 inotifywait:在被监听的文件或目录上等待特定文件系统事件发生,执行后处于阻塞状态。简单的说就是发生事件就执行。 因inotifywait可以做到监听事件,所以实现文件实时同步主要使用inotifywait。 服务模块名 des=backup # rsync服务用户连接认证密码文件路径 password=/etc/rsync.password # 连接认证用户 user=rsync_backup # inotifywait 程序路径 inotifywait=/usr/bin/inotifywait # 监听文件变化进行传输 $inotifywait -mrq -e 'modify,delete,create,attrib
说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控 1.5.3 inotifywait命令参数说明 参数 含义 -m, --monitor (重要参数) Keep listening -mrq /data --format "%w%f" -e create,delete,moved_to,close_write 1.6 对inotifywait命令的测试 对inotifywait 重命名临时文件,覆盖原文件 1.6.5 inotifywait监控中 -e 的参数使用 inotifywait -mrq /data --timefmt "%d/%m/%y %H:%M" --format 2.2.2.1 inotifywait和inotifywatch的作用: 一共安装了2个工具(命令),即inotifywait和inotifywatch inotifywait : 在被监控的文件或目录上等待特定文件系统事件 说明:yum安装后可以直接使用,如果编译安装需要进入到相应软件目录的bin目录下使用 #命令 man手册说明 # man inotifywait inotifywait - wait for changes
/usr/bin/inotifywait #监控目录数据信息变化 /usr/bin/inotifywatch #对监控的变化信息进行统计 inotifywait命令使用 inotifywait Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ] Options: -h|--help Without this option, inotifywait will exit after one If <seconds> is 0, inotifywait will never time out. inotify监控命令格式: inotifywait -mrq --timefmt "%F" --format "%T %w %f 事件信息:%e" /data -e CREATE 主要监控 create
redhat-release CentOS Linux release 7.0 (Final) Linux的文件监控工具 inotify-tools inotify-tools提供的两个命令行工具: inotifywait 在此次需求中,需要使用inotifywait inotifywait命令使用简介: inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。 其常用选项如下: -m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控; -r, --recursive:递归监控指定目录下的所有文件 echo 'all done' exit 文件一旦变化,打印memory dump和tcp dump memory dump 需要先获取 tomcat 的 PID 如果需要循环监听文件变化, 可以给inotifywait tomcatport=$(ps -ef | grep tomcat | grep -v grep | awk '{print $2}' ) echo $tomcatport echo 'wait' inotifywait
说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控 1.5.3 inotifywait命令参数说明 参数 含义 -m, --monitor (重要参数) Keep listening -mrq /data --format "%w%f" -e create,delete,moved_to,close_write 1.6 对inotifywait命令的测试 对inotifywait 命令测试的说明: 需要打开两个连接窗口 1窗口运行inotifywait 2窗口对文件夹进行操作,可在一窗口中查看出inotifywait的监控记录 1.6.1 、创建文件的逻辑↓ [root@nfs01 重命名临时文件,覆盖原文件 1.6.5 inotifywait监控中 -e 的参数使用 inotifywait -mrq /data --timefmt "%d/%m/%y %H:%M" --format 2.2.2.1 inotifywait和inotifywatch的作用: 一共安装了2个工具(命令),即inotifywait和inotifywatch inotifywait : 在被监控的文件或目录上等待特定文件系统事件
inotify-tools安装后会得到inotifywait和inotifywatch这两条命令: 一、安装 1.从内核和目录里面查看是否支持inotify [root@yaoji-dev-test ~ ln-sf /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0 三、参数详解 安装完成后会生成两个命令 /usr/bin/inotifywait /usr/bin/inotifywatch inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次 inotifywait命令参数: -m是要持续监视变化。 -r使用递归形式监视目录。 create创建,生成新文件 open打开,对文件进行打开操作 close关闭,对文件进行关闭操作 delete删除,文件被删除 四、使用示例 监听/tmp目录内所有文件和目录的"增删改"操作/usr/bin/inotifywait
和inotifywatch命令可以监控的文件数量(单进程情况) max_user_instances ----默认数值128,设置每个用户可以运行的inotifywait和inotifywatch 和inotifywatch inotifywait : 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用 inotifywatch 说明:yum安装后可以直接使用,如栗编译安装需要进入到相应软件目录的bin目录下使用 #命令man手册说明 # man inotifywait inotifywait - wait for changes /usr/bin/inotifywatch 安装完成后,进行监控测试 使用的测试命令: inotifywait -mr /data/ --format "%w%f 事件信息: %e" -e create /bin/bash inotifywait -mrq /data --format "%w%f" -e create,delete,moved_to,close_write|while read line
-rwxr-xr-x 1 root root 35438 04-14 13:42 /usr/local/bin/inotifywatch inotify-tools安装完成后,会生成inotifywait 和inotifywatch两个指令,其中,inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。 如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如: echo 30000000 > /proc/sys/fs/inotify/max_user_watches inotifywait相关参数 Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数: -m, 即--monitor,表示始终保持事件监听状态。 更详细的请参看man inotifywait。
经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑。 inotifywait 单独分析 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib / data/ 执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。 /bin/bash /usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file inotifywait 参数说明 参数名称 参数说明 -m,–monitor 始终保持事件监听状态 -r,–recursive 递归查询目录 -q,–quiet 只打印监控事件的信息
实现文件实时同步方案中,操作小文件未发现弊病,而在上传一个稍微大点的文件,比如十几二十几兆的文件时,弊病就会显露: 报错日志 如图分析原因:通过ftp或者其他客户端上传一个稍大点的文件到文件同步监控目录下,inotifywait 会实时监控到此目录下该文件的创建及修改,此时上传文件对文件修改可能是每1024个字节一次写入(可能更多,根据写文件客户端而定),因此在一定时间内造成了大量的并发,因为每次修改都会触发inotifywait 修改方案:在正常对文件的操作下,都会有CLOSE_WRITE,因此我们不需要让inotifywait监控MODIFY类型的事件,就不会触发大量并发的文件传输。 附上部分文件同步监控shell代码: /usr/local/bin/inotifywait -mrq --format '%Xe %w %f' \ -e create,delete 避免引发大量并发同步 ${path} | while read file; do rsync_changed "${file}" & done echo "inotifywait
ll /usr/bin/inotifywa* inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令,其中,inotifywait用于等待文件或文件集上的一个特定事件 如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如: echo 30000000 > /proc/sys/fs/inotify/max_user_watches inotifywait相关参数 Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数: •-m, 即–monitor,表示始终保持事件监听状态。 man inotifywait #查看手册
经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑。 点击这里查看 inotifywait 单独分析 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/ 执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。 /bin/bash /usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file inotifywait 参数说明 参数名称 参数说明 -m,–monitor 始终保持事件监听状态 -r,–recursive 递归查询目录 -q,–quiet 只打印监控事件的信息 –excludei
inotify安装完成之后会有两个命令,inotifywait 和 inotifywatch。 inotifywait用于等待文件或者文件集上的一个特定事件,可以监控任何文件或者目录位置,并且可以递归地监控整个目录树;inotifywatch 用于收集被监控的文件系统统计数据,包括每个inotify /bin/bash src=/tmp/test/ # directory to monitor /usr/local/bin/inotifywait -rmq -e modify $src inotifywait的输出结果,作为 while read files的输入。这里的脚本比较粗糙,因为每次有文件改动,inotifywait就会输出一行,改行表示有改动的文件。 的一些参数可能根据系统有所不同,请通过inotifywait命令查阅下相关参数及其意义。
=/usr/bin/inotifywait $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete /bin/bash VIP_NUM=`ip addr|grep 220|wc -l` RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep - =/usr/bin/inotifywait $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete /bin/bash VIP_NUM=`ip addr|grep 220|wc -l` RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep - =/usr/bin/inotifywait $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete
#停止方法:sudo pkill inotifywait. pid_file=/var/run/apache2.pid mon_log=/var/log/apache2/mon-apache.sh.log >>$mon_log; exit 1 ; fi #如果apache没有出问题,会阻塞在下面这里. inotifywait -q -e close $pid_file >>$mon_log 不等于0说明inotifywait不正常退出。
如果在shell环境下,可以安装 yum install inotify-tools,安装以后有两个命令可以用inotifywait 和 inotifywatch,inotifywait 是需要使用的命令 监听/usr/local/src 目录: /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M'--format '%T %w %f %e' /bin/sh # 监视的文件或目录 filename=$1 # 监视发现有增、删、改时执行的脚本 script=$2 inotifywait -mrq --format '%e'