一. 什麼是inotifycss
inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,Linux內核從2.6.13開始引入,容許監控程序打開一個獨立文件描述符,並針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、建立或者改變屬性。python
CentOS6天然已經支持:
使用ll /proc/sys/fs/inotify命令,是否有如下三條信息輸出,若是沒有表示不支持。linux
total 0 -rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events -rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances -rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches
/proc/sys/fs/inotify/max_queued_evnets表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。sql
/proc/sys/fs/inotify/max_user_instances表示每個real user ID可建立的inotify instatnces的數量上限。segmentfault
/proc/sys/fs/inotify/max_user_watches表示每一個inotify instatnces可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小。服務器
inotify-tools:app
inotify-tools是爲linux下inotify文件監控工具提供的一套C的開發接口庫函數,同時還提供了一系列的命令行工具,這些工具 能夠用來監控文件系統的事件。 inotify-tools是用c編寫的,除了要求內核支持inotify外,不依賴於其餘。inotify-tools提供兩種工具,一是inotifywait,它是用來監控文件或目錄的變化,二是inotifywatch,它是用來統計文件系統訪問的次數。異步
下載inotify-tools-3.14-1.el6.x86_64.rpm,經過rpm包安裝:函數
# rpm -ivh /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm warning: /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 4026433f: NOKEY Preparing... ########################################### [100%] 1:inotify-tools ########################################### [100%] # rpm -qa|grep inotify inotify-tools-3.14-1.el5.x86_64
二.inotifywait使用示例工具
監控/root/tmp目錄文件的變化:
/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \ -e modify,delete,create,move,attrib /root/tmp/
上面的命令表示,持續監聽/root/tmp目錄及其子目錄的文件變化,監聽事件包括文件被修改、刪除、建立、移動、屬性更改,顯示到屏幕。執行完上面的命令後,在/root/tmp下建立或修改文件都會有信息輸出:
2014/12/11-15:40:04 /root/tmp/ new.txt 2014/12/11-15:40:22 /root/tmp/ .new.txt.swp 2014/12/11-15:40:22 /root/tmp/ .new.txt.swx 2014/12/11-15:40:22 /root/tmp/ .new.txt.swx 2014/12/11-15:40:22 /root/tmp/ .new.txt.swp 2014/12/11-15:40:22 /root/tmp/ .new.txt.swp 2014/12/11-15:40:23 /root/tmp/ .new.txt.swp 2014/12/11-15:40:31 /root/tmp/ .new.txt.swp 2014/12/11-15:40:32 /root/tmp/ 4913 2014/12/11-15:40:32 /root/tmp/ 4913 2014/12/11-15:40:32 /root/tmp/ 4913 2014/12/11-15:40:32 /root/tmp/ new.txt 2014/12/11-15:40:32 /root/tmp/ new.txt~ 2014/12/11-15:40:32 /root/tmp/ new.txt ...
三.組合rsync實現實時同步
這一步的核心其實就是在客戶端建立一個腳本rsync.sh,適用inotifywait監控本地目錄的變化,觸發rsync將變化的文件傳輸到遠程備份服務器上。爲了更接近實戰,咱們要求一部分子目錄不一樣步,如/root/tmp/log和臨時文件。
1. 建立排除在外不一樣步的文件列表
排除不須要同步的文件或目錄有兩種作法,第一種是inotify監控整個目錄,在rsync中加入排除選項;第二種是inotify排除部分不監控的目錄,rsync天然也不會觸發。咱們選擇第二種。
這個操做在客戶端進行,/root/tmp/log以及/root/tmp/src目錄下的js、css和一些臨時文件不一樣步,因此不須要inotifywait,/root/tmp下的其餘文件和目錄都同步。(其實對於打開的臨時文件,能夠不監聽modify時間而改爲監聽close_write)
# vi /etc/inotify_rsync_exclude.lst: @/root/tmp/cache??* @/root/tmp/src/js @/root/tmp/src/css @/root/tmp/src @/root/tmp/src/20*/20*/20*/.??* @/root/tmp/log/
目前測試看到只能用絕對路徑。
2.客戶端同步到遠程的腳本rsync.sh
rsync.sh文件:
#variables
current_date=$(date +%Y%m%d_%H%M%S)
source_path=/home/guotmp/
log_file=/var/log/rsync_client.log
#rsync
rsync_server=192.168.1.84
rsync_user=ant5
rsync_pwd=/etc/rsync-84.pas
rsync_module=tmp
#rsync client pwd check
if [ ! -e ${rsync_pwd} ];then
echo -e "rsync client passwod file ${rsync_pwd} does not exist!"
exit 0
fi
#inotify_function
inotify_fun(){
/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
--fromfile /etc/inotify_rsync_exclude.lst -e modify,delete,create,move,attrib ${source_path} \
| while read file
do
/usr/bin/rsync -auvrtzopgP --progress --bwlimit=200 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
done
}
--bwlimit=200用於限制傳輸速率最大200kb,由於在實際應用中發現若是不作速率限制,會致使巨大的CPU消耗。
在客戶端運行腳本# ./rsync.sh便可實時同步目錄。
本文摘自:http://segmentfault.com/a/1190000002427568