Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。在内核 2.6.13 以上都可以使用。
Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:
一是 inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。
我家里安装了一个网络摄像机,用来监控家里的的入口是否有异常,如果有异常就会自动录像。录像文件存放在nas服务器上,为了把文件做备份,我又把录像文件定时复制到远程云服务器上。之前是采用定时备份的模式,实时性不好。为了保证备份的实时性,我查找了linux对文件的监控功能的资料,终于发现了inotify-tools这个工具。通过对inotify-tools的资料的学习,编写了一个自动执行脚本,当检测到摄像头保存视频的文件夹有变动,就自动用rsync把更改的文件同步到远程云服务器上。
下面就是安装和使用步骤:
1. 安装inotify-tools
centos7系统
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
debian 10系统
apt update
apt install inotify-tools
2. inotifywait使用
#!/bin/bash
dir=/ipcam #指定需要监视的文件夹
log_file=/watch.log #指定输出信息的文件,方便后面查看
rsync_file=/xxx.sh #发现文件有变化时需要执行的脚本文件
while
inotifywait -r $dir -o $log_file -e close \ #这里只监视文件的close动作
--timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e';
do
bash $rsync_file #执行同步文件的脚本
sleep 10m #等待10分钟,如果不加这个命令,同步会非常频繁,没必要
done
刚开始的时候因为不清楚inotifywait的执行机制,代码写的太复杂,反而出现问题,后来反复测试发现可以简化,就去掉了很多不必要的命令,这样流程也很清楚。
我的rsync脚本文件就是用rsync命令把视频文件同步到云服务器上,大家自行查找rsync的相关资料,这里就不再累述。
3. inotifywatch的使用
inofitywatch是用来监控文件或文件夹的变化,并输出统计信息的。
比如:
inotifywatch /ipcam -t 300
Establishing watches...
Finished establishing watches, now collecting statistics.
total access close_nowrite open filename
51 25 13 13 /ipcam/
这里监控了5分钟时间,总共出现了51次文件变更,其中access 25次,close_nowrite 13次,open 13次,结果清晰明了。
4. 最后,也是最重要的一点,设置开机启动脚本
crontab -e
然后添加下面一行
reboot /xxx/xxx.sh
Perfact!