inotify简介
- Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件)
- linux内核从2.6.13起,加入了Inotify支持
- 经过Inotify能够监控文件系统中添加,删除,修改,移动等各类事件
- 利用这个内核接口,第三方软件就能够监控文件系统下文件的各类变化状况
- 而inotify-tools正是实施这样监控的软件
- 国人周洋在金山公司开发的sersync(inotify+rsync命令)
inotify安装
yum -y install inotify-tools
# 查看帮助
inotifywait --help
inotify编译安装
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make && make install
ln -sv /usr/local/lib/libinotify* /usr/lib/
ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0
inotifywait命令参数
-r --recursive # 递归查询目录
-q --quiet # 打印不多的信息,仅仅打印监控事件的信息
-m,--monitor # 始终保持事件监听状态
--exclude # 排除文件或目录时,不区分大小写。
--timefmt # 指定时间输出的格式
--format # 打印使用指定的输出相似格式字符串
-e,--event # 经过此参数能够指定须要监控的事件,以下一个列表所示
event的各类事件含义
access # 文件或目录被读取
modify # 文件或目录内容被修改
attrib # 文件或目录属性被改变
close # 文件或目录封闭,不管读/写模式
open # 文件或目录被打开
moved_to # 文件或目录被移动至另一个目录
move # 文件或目录被移动到另外一个目录或从另外一个目录移动至当前目录
create # 文件或目录被建立在当前目录
delete # 文件或目录被删除
umount # 文件系统被卸载
关键参数调整
- 在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有必定的限制
max_user_watches
设置inotifywait或inotifywatch命令能够监视的文件数量(单进程)
max_user_instances
设置每一个用户能够运行的inotifywait或inotifywatch命令的进程数
max_queued_events
设置inotify实例事件(event)队列可容纳的事件数量
inotifywait案例
# 测试create
inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e create /backup
# 测试多个事件
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move /mnt/data
inotify+rsync 脚本案例
#!/bin/bash
src=/mnt/data/files/service
#src=/data
#des=/data
ip1=192.168.10.1
user=root
cd ${src}
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ${src} | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
INO_DIRNAME_DIR=$(dirname ${INO_FILE})
INO_BASENAME_DIR=$(basename ${INO_FILE})
#echo ${file} # file= MODIFY /data/liang
#echo ${INO_EVENT} # MODIFY
#echo ${INO_FILE} # /data/liang
#echo ${INO_DIRNAME_DIR} # /data
#echo ${INO_BASENAME_DIR} # liang
LOG_DATE=`date "+%Y-%m-%d %H:%M:%S"` # 2018-09-29 16:34:28
echo ${LOG_DATE} : ${file}
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]]
then
des=${INO_DIRNAME_DIR/mnt/wotv}
echo ${LOG_DATE} : "rsync -avz ${INO_FILE} -e 'ssh -p 222' ${user}@${ip1}:${des}"
echo -----------------------------------------------------------
rsync -avz ${INO_FILE} -e 'ssh -p 222' ${user}@${ip1}:${des} > /tmp/lianglog.tmp
cat /tmp/lianglog.tmp && rm -rf /tmp/lianglog.tmp
echo -----------------------------------------------------------
fi
done
后台运行脚本
nohup sh /mnt/liang/wotv_picture.sh >> /var/log/liangrs_wotvpicture.log &