引用:
Inotify 是文件系統事件監控機制,計劃包含在即將發布的 Linux 內核中作為 dnotify 的有效替代。dnotify 是較早內核支持的文件監控機制。Inotify一種強大的、細粒度的、異步的機制,它滿足各種各樣的文件監控需要,不僅限於安全和性能。下面讓我們一起學習如何安裝 inotify 和如何構建一個示例用戶空間應用程序來響應文件系統事件。
文件系統事件監控對於從文件管理器到安全工具的各種程序都是必要的,但是 dnotify(早期內核中的標准)存在一些局限性,這使我們期待出現一種更加完善的機制。抱著這種期待,我們發現了 inotify,一種更加現代化的文件系統事件監控替代品。
為什麼使用 inotify?
使用 inotify 取代 dnotify 的原因有很多。第一個原因是,dnotify 需要您為每個打算監控是否發生改變的目錄打開一個文件描述符。當同時監控多個目錄時,這會消耗大量的資源,因為有可能達到每個進程的文件描述符限制。
除此之外,文件描述符會鎖定目錄,不允許卸載(unmount)支持的設備,這在存在可移動介質的環境中會引發問題。在使用 inotify 時,如果正在監控被卸載的文件系統上的文件,那麼監控會被自動移除並且您會接收到一個卸載事件。
dnotify 不如 inotify 的第二個原因是 dnotify 有點復雜。注意,使用 dnotify 基礎設施的簡單文件系統監控粒度只停留於目錄級別。為了使用 dnotify 進行更細粒度的監控,應用程序編程人員必須為每個受監控的目錄保留一個 stat 結構的緩存。該用戶空間的 stat 結構緩存需要用來明確確定當接收到通知信號時目錄發生了什麼變化。當獲得通知信號時,生成 stat 結構列表並與最新的狀態相比較。顯而易見,這種技術是不理想的。
inotify 的另一個優點是它使用文件描述符作為基本接口,使應用程序開發者使用 select 和 poll 來監控設備。這允許有效的多路 I/O 和與 Glib 的 mainloop 的集成。相反,dnotify 所使用的信號常常使程序員頭疼並且感覺不太優雅。
inotify 通過提供一個更優雅的 API 解決了這些問題,該 API 使用最少的文件描述符,並確保更細粒度的監控。與 inotify 的通信是通過設備節點提供的。基於以上原因,對於監控 Linux 2.6 平台上的文件,inotify 是您最明智的選擇。
linux/l-inotify.html#N10081">http://www-128.ibm.com/developerworks/cn/linux/l-inotify.html#N10081
正文:
sotfware: inotify-tools-3.13.tar.gz
OS: Ubuntu server 8.10
server1: 192.168.6.2
server2: 192.168.6.3
需求 server1 目錄 /home/ludy/rsync 時時同步 server2 /home/ludy
安裝步驟:
1.首先確認你的內核支持inotify,如果不支持對內核打補丁,一般情況內核在 2.6.3以上的都支持的。你可以確認下運行
ludy@server1:~$ls -l /proc/sys/fs/inotify/
總用量 0
-rw-r--r-- 1 ludy ludy 0 2008-12-16 14:40 max_queued_events
-rw-r--r-- 1 ludy ludy 0 2008-12-16 14:40 max_user_instances
-rw-r--r-- 1 root root 0 2008-12-16 09:07 max_user_watches
如果沒有的話,呵呵安裝inotify~
2.安裝軟件 inotify-tools-3.13.tar.gz
ludy@server1:~$ tar zxvf inotify-tools-3.13.tar.gz
ludy@server1:~$ cd inotify-tools-3.13
ludy@server1:~$ ./configure --prefix=/usr/local/inotify
ludy@server1:~$ make
ludy@server1:~$ make install
2.生成SSH KEY 讓 server1 ssh訪問 server2不需要密碼~
ludy@server1:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ludy/.ssh/id_rsa): //輸入回車
Enter passphrase (empty for no passphrase): //輸入密碼回車
Enter same passphrase again: //再輸入確認後回車
Your identification has been saved in /home/ludy/.ssh/id_rsa.
Your public key has been saved in /home/ludy/.ssh/id_rsa.pub.
The key fingerprint is:
f1:35:4e:88:11:f1:c4:5a:7a:c9:2a:90:d3:5e:0a:6f ludy@ludy
The key's randomart image is:
+--[ RSA 2048]----+
| ++. |
| =o. |
| o o=o.+ |
| = . +o++ . |
| * oSo. . |
| E . |
| . . |
| |
| |
+-----------------+
3.然後把你用戶目錄下的 .ssh/id_rsa.pub 拷貝到 server2 的root下(我作的測試所以用的root,你最好不要用root很危險~)
ludy@server1:~/.ssh$ scp id_rsa.pub [email protected]:~/.ssh
拷貝過去後,進入server2 id_rsa.pub 把 名字改為 authorized_keys
root@server2:~/.ssh$ mv id_rsa.pub authorized_keys
root@server2:~/.ssh$ shown root:root authorized_keys //改變使用者 root
root@server2:~/.ssh$ chmod 600 authorized_keys //改變權限
4.在server1編寫shell腳本
cat inosync.sh
#!/bin/sh
SRC=/home/ludy/rsync/
[email protected]:/home/ludy
INWT=/usr/local/inotify/bin/inotifywait
RSYNC=/usr/bin/rsync
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
rsync -aHqzt $SRC $DST
done
我解釋一下
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
rsync -aHqzt --delete $SRC $DST
-m 是保持一直監聽
-r 是遞歸查看目錄
-q 是打印出事件~
-e create,move,delete,modify
監聽 創建 移動 刪除 寫入 事件
rsync -aHqzt $SRC $DST
-a 存檔模式
-H 保存硬連接
-q 制止非錯誤信息
-z 壓縮文件數據在傳輸
-t 維護修改時間
-delete 刪除於多余文件
5.測試
ludy@server1:~$ ./inosync.sh &
ludy@server1:~$ cd rsync
ludy@server1:~/rsync$ touch asdfa
在server2 機器查看
root@server2:/home/ludy$ ls
asdfa
注意,可能第一次SSH 連接的時候需要輸入一次密碼,以後就不需要輸入了~
本文出自 “linuxer” 博客,請務必保留此出處http://deidara.blog.51cto.com/400447/120008