rsync 05-inotify使用

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 &
相關文章
相關標籤/搜索