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!

发表评论

您的电子邮箱地址不会被公开。