一、inotifywait介绍

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

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

    inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
    inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

二、安装

apt-get install inotify-tools

三、参数说明

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:指定监控事件项

    open   打开文件
    access 访问文件
    modify 修改文件
    delete 删除文件
    create 新建文件
    attrib 属性变更
 
--exclude <pattern> 指定要排除监控的文件/目录

 

例子1:命令监听log.txt文件

$ inotifywait -m log.txt
# 这里 -m 参数指明持续监听,不加的话会在一个事件后退出

Setting up watches.
Watches established.
# 此时持续监听,有事件出发会输出到屏幕

 例子2:指定监听事件

inotifywait -m -e create,delete,close_write log.txt

 例子3:inotifywait和rsync结合

#!/bin/bash

source=/home/kms/Desktop/inotifywait_shell/source/
target=/home/kms/Desktop/inotifywait_shell/target/

log_path=/home/kms/Desktop/inotifywait_shell/inotifywait.log

inotifywait -mrq ${source} --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f %e' -e create,modify,attrib,move,delete,close_write | while read files;
do
    echo "$files" >> ${log_path}
    INO_EVENT=$(echo $files | awk '{print $5}')
    # 增改查类型
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] || [[ $INO_EVENT =~ 'ATTRIB' ]]
    then
        rsync -avzc ${source} ${target}
    fi
    # 删除&移出事件
    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
        rsync -avz --delete ${source} ${target}
    fi
done

备注:

利用 inotifywait 对文件系统事件实时监控, 触发事件调用 rsync 同步指定目录 (缺点: 每次触发都要扫描整个目录进行文件差异对比, 文件越多越耗时长)

 

其他参考

https://www.cnblogs.com/clsn/p/8022625.html

posted on 2022-02-24 10:12  陌鉎こ城sHi  阅读(786)  评论(0编辑  收藏  举报