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 &