通過rsync+inotify-tools+ssh實現觸發式遠程實時同步
但是,我們一般都是通過結合crontab計劃任務來實現文件同步的,這樣做的缺點是效率低,不能做到實時同步。
現在,在Linux平臺下我們可以利用2.6內核的inotify監控文件系統機制,通過inotify-tools來實現實時同步了。
具體操作如下:
目前各大Linux發行版本都已經具有了rsync與inotify-tools的軟件包,推薦通過RPM,yum,apt-get等方式進行安裝。
RHEL:
[root@server1 ~]# rpm -ivh rsync-*
[root@server1 ~]# rpm -ivh inotify-tools-*
[root@server1 ~]# yum install rsync inotify-tools
[root@server1 ~]# apt-get install rsync inotify-tools
[root@server1 ~]# wget ftp://ftp.samba.org/pub/rsync/rsync-3.0.8.tar.gz
[root@server1 ~]# tar xzvf rsync-3.0.8.tar.gz
[root@server1 ~]# cd rsync-3.0.8
[root@server1 ~]# ./configure
[root@server1 ~]# make
[root@server1 ~]# make install
[root@server1 ~]# tar xzvf inotify-tools-3.14.tar.gz
[root@server1 ~]# cd inotify-tools-3.14
[root@server1 ~]# ./configure
[root@server1 ~]# make
[root@server1 ~]# make install
建議通過普通用戶進行操作,理由是通過root操作本身就危險,免密碼登陸的root就更危險了。
[root@server1 ~]# useradd -m rsync
[root@server1 ~]# passwd rsync
[root@server2 ~]# useradd -m rsync
[root@server2 ~]# passwd rsync
[rsync@server1 ~]$ ssh-keygen -t rsa
在提示保存私鑰(key)和公鑰(public key)的位置時,使用默認值;
在提示是否需要私鑰密碼(passphrase)時,直接敲回車,即不使用私鑰密碼。
之後,將生成一對密鑰,id_rsa(私鑰文件)和id_rsa.pub(公鑰文件),保存在/home/rsync/.ssh/目錄下。
將文件上傳到遠程主機(假設遠程主機IP爲192.168.10.4)
[rsync@server1 ~]$ scp ~/.ssh/id_rsa.pub [email protected]:/home/rsync/
[rsync@server2 ~]$ mkdir .ssh
[rsync@server2 ~]$ chmod 700 .ssh
[rsync@server2 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
[root@server1 ~]# /etc/init.d/sshd restart
[root@server2 ~]# /etc/init.d/sshd restart
[root@server1 ~]# vim inotify_rsync.sh
#!/bin/sh SRC=/home/rsync/test [email protected]:/home/rsync/test /bin/su - rsync /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src} | while D E F do /usr/bin/rsync -ahqzt --delete $SRC $DST done
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直監聽
-r 是遞歸查看目錄
-q 是打印出事件
-e create,move,delete,modify,attrib 是指 “監聽 創建 移動 刪除 寫入 權限” 事件
-a 存檔模式
-h 保存硬連接
-q 制止非錯誤信息
-z 壓縮文件數據在傳輸
-t 維護修改時間
-delete 刪除於多餘文件
要排除某個目錄的事件監聽的處理時,爲inotifywait添加--exclude或--excludei參數,具體查看man inotifywait。
[root@server1 ~]# chmod +x inotify_rsync.sh
執行腳本
[root@server1 ~]# /root/inotify_rsync.sh &
設置腳本開機自啓動
[root@server1 ~]# cat "/root/inotify_rsync.sh &" >> /etc/rc.local
首先在server1服務器的/home/rsync/test目錄下創建文件或目錄,然後再到server2的/home/rsync/test目錄下查看,如果看到就說明成功了。
[rsync@server1 ~]$ cd test
[rsync@server1 test]$ touch a.txt
注意:第一次SSH連接的時候可能需要輸入一次密碼,之後就不需要輸入了。
[rsync@server2 test]$ ls
a.txt