inotify 是一个很好用的触发软件,作用大概就是帮你监控某个文件夹的改动,然后可以作出处理。
官方网站https://github.com/rvoicilas/inotify-tools/wiki/
 

下面我们来尝试安装和应用几个实例
例如你现在监控/aaa 这文件(包含子目录)
当有人在修改/aaa/test.txt 文件 改软件会马上输出一条信息。

下载:inotify-tools-3.14.tar.gz
# tar zxvf inotify-tools-3.14.tar.gz
#./configure --prefix=/usr
#make
#su -c 'make install'

如果出现这个错误“/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0”可以采用以下办法解决:

ln -sv /usr/local/lib/libinotify* /usr/lib/
ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0
cp /usr/lib/libinotifytools.so.0 /usr/local/lib/

装好了,尝试运行
[root@mysql1 test# /usr/bin/inotifywait -rme modify,delete,create,attrib  /aaa
然后再/aaa下新建或修改文件
显示结果
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/aaa/ CREATE .test.swp
/aaa/ CREATE .test.swpx
/aaa/ DELETE .test.swpx
/aaa/ DELETE .test.swp
/aaa/ CREATE .test.swp
/aaa/ MODIFY .test.swp
/aaa/ MODIFY .test.swp
/aaa/ CREATE test
/aaa/ MODIFY test
/aaa/ MODIFY .test.swp
/aaa/ DELETE .test.swp

modify,delete,create,attrib 分别是修改,删除,新建。
在后面添加--exculde=PATTERN参数可以忽略某个子文件夹

inotify 可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所说的文件也包括目录。

触发处理

官方已个利用inotify 触发RSYNC同步的例子

#!/bin/sh

# get the current path
CURPATH=`pwd`

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e close_write /tmp/test | while read date time dir file; do

       FILECHANGE=${dir}${file}
       # convert absolute path to relative
       FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`

       rsync --progress --relative -vrae 'ssh -p 22'  $FILECHANGEREL [email protected]:/backup/root/dir && \
       echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync"
done
 

例子2:
#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
 

一个简单SHELL触发:
vim test.sh
#!/bin/bash
/usr/local/inotify/bin/inotifywait -rme create /aaa \       --监控/aaa文件夹新建的文件
| while read file
do
        a=${dir}${file}          ---输出的信息
        a=`echo "$a" |awk '{print $1$3}'`  ---通过awk截取完整路径
        echo $a
        echo ${file}
done

do-done之间写上你要做的代码,例如RSYNC。。。。

 

网上一个的rsync触发同步例子

#!/bin/sh
src=/data/www/wwwroot/
des=/data/www/wwwroot
ip=192.168.1.101

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' \
-e modify,delete,create,attrib \
${src} \
| while read  file
        do
                rsync -avz --delete --progress ${src} root@${ip}:${des} &&
                #echo "${src} was rsynced"
                #echo "-----------------------------------------------------"
        done