程序方程式美好生活

inotify用法

inotify监控文件

  • 比如监控a.c文件,当a.c文件被操作的时,会有提示输出。

命令:
inotifywait -r /root/a.c -e create,delete,modify,access,attrib,close_write,close_nowrite,open,moved_to,moved_from,move,move_self,create,delete_self,unmount

inotify监控目录

  • 比如监控/home/rocky目录,当/home/rocky被操作的时,会有提示输出。
    命令:
    inotifywait -r /home/rocky -e create,delete,modify,access,attrib,close_write,close_nowrite,open,moved_to,moved_from,move,move_self,create,delete_self,unmount

inotify -e 参数的含义

  • access:从监视文件或监视目录中的文件读取。
  • modify:监视文件或监视目录内的文件被写入。
  • attrib:监视文件的元数据或监视目录中的文件的元数据已修改。包括文件权限、扩展属性等
  • close_write:监视文件或监视目录中的文件在以可写模式打开后被关闭。这并不一定意味着该文件已被写入
  • close_nowrite:关注的文件或关注的目录中的文件在以只读模式打开后被关闭
  • close:关注的文件或关注的目录中的文件被关闭,而不管它是如何打开的。请注意,这实际上只是通过监听CLOSE_WRITE和CLOSE_NOWRITE来实现,因此接收到的所有CLOSE事件都将作为其中之一输出,而不是CLOSE
  • open:已打开监视文件或监视目录中的文件。
  • move to:文件或目录已移动到监视目录中。即使简单地将文件从同一目录移出或移至同一目录,也会发生此事件
  • moved_from:文件或目录已移动到监视目录中。即使简单地将文件从同一目录移出或移至同一目录,也会发生此事件
  • move:文件或目录已从监视目录移出或移至监视目录。请注意,这实际上只是通过监听MOVERED_TO和MOVERED_FROM来实现,因此接收到的所有关闭事件都将作为这两个事件中的一个或两个输出,而不是MOVE
  • move_self:已移动受监视的文件或目录。此事件之后,将不再监视该文件或目录
  • create:在监视目录中创建了文件或目录
  • delete:监视目录中的文件或目录已删除
  • delete_self:监视的文件或目录已删除。在此事件之后,将不再监视该文件或目录。请注意,即使没有显式侦听此事件,也可能会发生此事件
  • unmount:监视的文件或目录所在的文件系统已卸载。在此事件之后,将不再监视该文件或目录。请注意,即使没有显式监听此事件,也可能会发生此事件

inotify选项

-h 或 --help 显示帮助

 --exclude <pattern> 指定排除(忽略)部分文件或目录,这些文件或目录上不监听任何事件,正则表达式书写(相对路径)
  FMT: # --exclude 'Runtime' //忽略对Runtime目录的事件监听

--excludei <pattern> 与--exclude相同,区别是此选项正则表达式忽略大小写

-m 或 --monitor 持续保持监听(如果不加此选项,则监听到一次后便退出)

-d 或 --daemon 以守护进程方式后台运行(除了在后台运行外,与-m选项一样)

-r 或 --recursive 递归监听其下所有子目录及文件

--fromfile <file> Read files to watch from <file> or `-' for stdin.

-o 或 --outfile <file> 将事件输出到指定文件,而不输出到屏幕
  FMT: -o /var/log/inotifywait.log

-s 或 --syslog 将错误发送到系统日志,而不是输出到屏幕

-q 或 --quiet 打印较少信息(仅打印事件)

-qq 不打印任何信息(静默方式)

--format <fmt> 设置打印屏幕的格式,常见选项:%T时间;%w触发事件文件所在绝对路径;%f触发事件文件名称;%e触发的事件名称;
  FMT: # --format '%T %f %e' 

--timefmt <fmt> 指定输出时间内容,相当于将时间赋值给%T
  FMT: # --timefmt '%y-%m-%d %H:%M'

-c 或 --csv 用CSV格式打印事件

-t 或 --timeout <seconds> 指定一次性监听时间,超时退出监听(值为0表示永不超时,单位:秒),不可与 -m -d 连用
  FMT: # -t 60 //设定监听60秒,60秒内监听到事件立即退出,如果监听不到事件60秒后也退出

-e 或 --event <event1> [ -e|--event <event2> ... ] 指定要监听的事件(多个事件用逗号分割)
  FMT: # -e 'create,delete,close_write,attrib,moved_to'

inotify 脚本

  • 脚本功能:监控a.c文件,当a.c文件被操作的时,输出事件已触发
  • 脚本代码:
#! /bin/bash
MON_ITEM='create,delete,modify,access,attrib,close_write,close_nowrite,open,moved_to,moved_from,move,move_self,create,delete_self,unmount'

while inotifywait -r /root/a.c -e ${MON_ITEM}
do 
           echo "事件已触发!"
done
  • 脚本功能:监控tmp目录,当tmp目录被操作的时,输出事件已触发
  • 脚本代码:
#! /bin/bash
MON_ITEM='create,delete,modify,access,attrib,close_write,close_nowrite,open,moved_to,moved_from,move,move_self,create,delete_self,unmount'

while inotifywait -r /tmp/ -e ${MON_ITEM}
do 
           echo "事件已触发!"
done

“`

发表评论