Inotify 是一個 Linux特性,它監(jiān)控文件系統(tǒng)操作粥诫,比如讀取油航、寫入和創(chuàng)建。Inotify 反應(yīng)靈敏怀浆,用法非常簡單谊囚,并且比 cron 任務(wù)的繁忙輪詢高效得多。在內(nèi)核 2.6.13 以上都可以使用执赡。
Inotify一種強大的镰踏、細粒度的沙合、異步文件系統(tǒng)監(jiān)控機制,它滿足各種各樣的文件監(jiān)控需要绊率,可以監(jiān)控文件系統(tǒng)的訪問屬性滤否、讀寫屬性、權(quán)限屬性肥惭、刪除創(chuàng)建蜜葱、移動等操作耀石,也就是可以監(jiān)控文件發(fā)生的一切變化滞伟。
inotify-tools是一個C庫和一組命令行的工作提供Linux下inotify的簡單接口。inotify-tools安裝后會得到inotifywait和inotifywatch這兩條命令:
一是 inotifywait野崇,它是用來監(jiān)控文件或目錄的變化乓梨,二是inotifywatch清酥,它是用來統(tǒng)計文件系統(tǒng)訪問的次數(shù)焰轻。
我家里安裝了一個網(wǎng)絡(luò)攝像機,用來監(jiān)控家里的的入口是否有異常蝠筑,如果有異常就會自動錄像什乙。錄像文件存放在nas服務(wù)器上稳强,為了把文件做備份,我又把錄像文件定時復制到遠程云服務(wù)器上退疫。之前是采用定時備份的模式,實時性不好褒繁。為了保證備份的實時性,我查找了linux對文件的監(jiān)控功能的資料燕差,終于發(fā)現(xiàn)了inotify-tools這個工具徒探。通過對inotify-tools的資料的學習喂窟,編寫了一個自動執(zhí)行腳本磨澡,當檢測到攝像頭保存視頻的文件夾有變動,就自動用rsync把更改的文件同步到遠程云服務(wù)器上稚字。
下面就是安裝和使用步驟:
1. 安裝inotify-tools
家里的服務(wù)安裝的是debian 10系統(tǒng)胆描,是可以直接安裝inotify-tools工具的
#apt update
#apt install inotify-tools
就是這么簡單袄友,看網(wǎng)上很多文章都寫的是從github下載.gz文件霹菊,然后解壓縮旋廷,再&……%&*&……饶碘,其實完全不用這么麻煩馒吴,就只需要上面兩行命令就完成了。
然后執(zhí)行inotifywatch --help豪治,有輸出命令說明就表明工具安裝正常,可以使用了烦衣。
#inotifywatch --help
inotifywatch 3.14
Gather filesystem usage statistics using inotify.
Usage: inotifywatch [ options ] file1 [ file2 ] [ ... ]
Options:
-h|--help Show this help text.
-v|--verbose Be verbose.
@<file> Exclude the specified file from being watched.
--fromfile <file>
Read files to watch from <file> or `-' for stdin.
--exclude <pattern>
Exclude all events on files matching the extended regular
expression <pattern>.
--excludei <pattern>
Like --exclude but case insensitive.
-z|--zero
In the final table of results, output rows and columns even
if they consist only of zeros (the default is to not output
these rows and columns).
-r|--recursive Watch directories recursively.
-t|--timeout <seconds>
Listen only for specified amount of time in seconds; if
omitted or 0, inotifywatch will execute until receiving an
interrupt signal.
-e|--event <event1> [ -e|--event <event2> ... ]
Listen for specific event(s). If omitted, all events are
listened for.
-a|--ascending <event>
Sort ascending by a particular event, or `total'.
-d|--descending <event>
Sort descending by a particular event, or `total'.
Exit status:
0 - Exited normally.
1 - Some error occurred.
Events:
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in
writable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
2. inotifywait使用
這里直接給出我的腳本代碼,再做一個說明吧!
#!/bin/bash
dir=/ipcam #指定需要監(jiān)視的文件夾
log_file=/watch.log #指定輸出信息的文件衅澈,方便后面查看
rsync_file=/xxx.sh #發(fā)現(xiàn)文件有變化時需要執(zhí)行的腳本文件
while
inotifywait -r $dir -o $log_file -e close \ #這里只監(jiān)視文件的close動作
--timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e';
do
bash $rsync_file #執(zhí)行同步文件的腳本
sleep 10m #等待10分鐘谬墙,如果不加這個命令,同步會非常頻繁险耀,沒必要
done
剛開始的時候因為不清楚inotifywait的執(zhí)行機制甩牺,代碼寫的太復雜,反而出現(xiàn)問題贬派,后來反復測試發(fā)現(xiàn)可以簡化搞乏,就去掉了很多不必要的命令请敦,這樣流程也很清楚储玫。
我的rsync腳本文件就是用rsync命令把視頻文件同步到云服務(wù)器上,大家自行查找rsync的相關(guān)資料匣椰,這里就不再累述端礼。
3. inotifywatch的使用
inofitywatch是用來監(jiān)控文件或文件夾的變化,并輸出統(tǒng)計信息的佳镜。
比如:
# inotifywatch /ipcam -t 300
Establishing watches...
Finished establishing watches, now collecting statistics.
total access close_nowrite open filename
51 25 13 13 /ipcam/
這里監(jiān)控了5分鐘時間,總共出現(xiàn)了51次文件變更贫奠,其中access 25次唤崭,close_nowrite 13次脖律,open 13次,結(jié)果清晰明了芦疏。
4. 最后微姊,也是最重要的一點兢交,設(shè)置開機啟動腳本
#crontab -e
然后添加下面一行
@reboot /xxx/xxx.sh
Perfact!
當然inotifywait和inotifywatch還有很多參數(shù)可以設(shè)置酪穿,功能也很強大晴裹,這里我只用了冰山一角就完成了我的任務(wù)涧团。很好泌绣,很強大!赞别!
置于inotify-tools的資料仿滔,可以自己找“男人”問問!
#man inotifywait
這個是最權(quán)威的資料崎页,前提是你喜歡english,當然現(xiàn)在網(wǎng)絡(luò)上也有成堆的中文解釋和說明可以閱讀蜈膨,就看個人習慣吧翁巍!
最后,慶祝下我這篇簡書處女作的誕生T詈杈曲!