inotifywait监听php,inotifywait文件监控

inotifywait 异步文件系统监控机制

Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。

inotify-tools 是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:

inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。

inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

开始之前需要检测系统内核是否支持inotify:

使用uname -r命令检查Linux内核,如果低于2.6.13,就需要重新编译内核加入inotify的支持。

使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。

ll /proc/sys/fs/inotify

total 0

-rw-r--r-- 1 root root 0 Jan 4 15:41 max_queued_events

-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_instances

-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_watches

inotifywait使用

语法:inotifywait [-hcmrq] [-e ] [-t ] [–format ] [–timefmt ] [ … ]

-m:一直监控指定的目录,接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。

@:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

-o, –outfile :输出事情到一个文件而不是标准输出。

-s, –syslog:输出错误信息到系统日志

-d, –daemon:跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。

–exclude :正则匹配需要排除的文件,大小写敏感。

–excludei :正则匹配需要排除的文件,忽略大小写。

-t , –timeout :设置超时时间,如果为0,则无限期地执行下去。

-r:递归监控所监控目录的子目录。

-q:指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。

–timefmt:指定时间格式。

–format:

%w 表示发生事件的目录

%f 表示发生事件的文件

%e 表示发生的事件

%Xe 事件以“X”分隔

%T 使用由–timefmt定义的时间格式

-e:指定监控事件项

举个例子:

/usr/bin/inotifywait -m -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib var

57e3819a2e7c?tdsourcetag=s_pctim_aiomsg

image.png

todo:有个问题,如果只是监控一个文件,监控一个目录就没有问题

/usr/bin/inotifywait -m -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib test.txt

log日志只会在第一次时显示,后面test.txt变化都不会记录在日志上

守护进程模式如果只监控一个文件也启动不了,查看进程并没有启动

/usr/bin/inotifywait -d -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib t.txt

/usr/bin/inotifywait -d -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify var/test.txt

在守护进程模式下,-o参数和被监控的目录必须为绝对路径,否则日志不会输出

/usr/bin/inotifywait -drq -o /root/sentry/sentry.log --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --excludei "(swp|swx)" /root/sentry/var

完整的例子:

!/bin/bash

inotifywait -drq -o /tmp/inotifywait.log --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --excludei "(swp|swx)" /var/www | while read file; do

echo ${file}

done

守护进程下echo无效。得把-d改成-m

参考:http://wangchujiang.com/linux-command/c/inotifywait.html

https://github.com/rvoicilas/inotify-tools/issues/5

inotify 优点:

1)监控文件系统事件变化,通过同步工具实现实时数据同步。

inotify 缺点

1)并发如果大于200个文件(10-100k),同步就会有延迟

2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。

3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?

serysync功能多:(inotify+rsync命令)

1)支持通过配置文件管理

2)真正的守护进程socket

3)可以对失败文件定时重传(定时任务功能)

4)第三方的HTTP接口(例如:更新cdn缓存)

5)默认多进程rsync同步

参考:https://www.cnblogs.com/chensiqiqi/p/6542268.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值