inotify-tools实时监控文件夹或文件变化

安装inotify-tools

1
yum install -y inotify-tools

编写监控脚本

  • 监测到变化后需要执行的脚本

以文件变化自动提交gitlab为例

1
2
3
4
5
6
vim auto-commit-git.sh
#!/bin/bash

DATE=`date +%Y-%m-%d`
FILE_HOME=/data/www/kode/data/User/root/home/note/
cd ${FILE_HOME} && git add . && git commit -m "${DATE}";git push http://root:xxx@gitlab.xxx.com/root/note.git master
  • 编写循环监控脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vim monitor_note.sh
    #!/bin/sh

    # 监视的文件或目录
    filename=/data/www/kode/data/User/root/home/note

    # 监视发现有增、删、改时执行的脚本
    script=/data/entrypoint/scripts/auto-commit-git.sh

    inotifywait -mrq --format '%e' --event create,delete,modify $filename | while read event
    do
    case $event in MODIFY|CREATE|DELETE) bash $script ;;
    esac
    done
  • 运行脚本监控目录
    1
    2
    3
    chmod +x auto-commit-git.sh
    chmod +x monitor_note.sh
    nohup sh monitor_note.sh >/tmp/inotify.log 2>&1

inotify-tools选项解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

@<file> #排除不需要监视的文件,可以指定相对路径或绝对路径
--fromfile <file> #从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-m|--monitor #收到单个事件不退出,一直监视,默认:收到单个事件后立即退出
-d|--daemon #跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog
-o|--outfile <file> #输出事件到<file>而不是stdout
-s|--syslog #输出错误信息到syslog而不是stderr
-r|--recursive #监控目录下所有子目录,创建新的子目录也会被监控
-q|--quiet #不输出详细信息
--exclude <pattern> #不处理正则表达式匹配到的文件的任何事件,大小写敏感
--excludei <pattern> #不处理正则表达式匹配到的文件的任何事件,大小写敏感
-t <seconds>, --timeout <seconds> #设置超时时间,如果为0,则一直等待事件
-e <event>, --event <event> #指定监听的事件,可以多次指定,如果省略,则监听所有事件
-c, --csv #输出为csv格式
--timefmt <fmt> #指定时间格式,用于--format选项中的%T格式
--format <fmt> 指定输出格式
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由--timefmt定义的时间格式

inotify-tools事件选项解析

inotify-tools事件选项--event可以监听的事件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
access 读取文件或目录

modify 写文件或目录

attrib 更改文件或目录属性

close_write 文件在写后关闭

close_nowrite 文件在只读模式下被读后关闭

close 文件或目录被关闭

open 文件或目录被打开

moved_from 文件或者目录移出监视目录

moved_from 文件或目录从监视目录移出

move 文件或目录移动

create 创建文件或目录

delete 删除文件或目录

delete_self 删除后不再监听此文件或目录

unmount 文件系统取消挂载,此后不在监听该文件系统