2012-01-02 61 views
25

如何監視整個目錄樹在Linux中的變化(ext3文件系統)?如何在Linux中監視完整的目錄樹以進行更改?

目前該目錄包含約3000 子目錄,在三個目錄級別組織有關五十萬文件

這些大部分都是小文件(< 1kb,幾個可達100 kb)。這是一種隊列,我需要知道何時創建,刪除文件或在5-10秒內修改其內容。我知道有inotify和排序,但AFAIK他們只監視一個目錄,這意味着我需要3,000 inotify句柄 - 在我的情況下 - 超過通常的1024個句柄允許一個進程。或者我錯了?

如果Linux系統不能告訴我什麼,我需要:也許有一個FUSE項目,模擬文件系統(複製所有文件真實文件系統上訪問),並分別記錄所有修改(不能罰款一個)?

回答

12

據我所知,除了在每個目錄上遞歸設置inotify腕錶外,沒有別的辦法。

也就是說,您不會用完文件描述符,因爲inotify不必保留fd來觀察文件或目錄(其前身dnotify確實遭受此限制)。 inotify改爲使用「觀察描述符」。

根據inotifywatch的文檔,默認限制是8192個觀察描述符,您可以通過將新值寫入/proc/sys/fs/inotify/max_user_watches來增加它。

+0

聽起來不錯。在使用這麼多觀看描述符時需要考慮的負面因素? – 2012-01-02 09:50:11

+0

不,除了創建所有手錶所花費的時間之外,我不認爲你會遇到只有3000個子目錄的問題。 – 2012-01-02 09:52:25

3

是不是應該fanotify最終提供這種能力? 引用LWN

」fanotify有兩個基本的'模式'指導和全球。 [...]全球fanotify指示 它希望系統上的所有內容,然後單獨標記 它不關心的inode。

雖然我錯過了最新的狀態。

+1

根據對http://stackoverflow.com/a/1847268/130352的評論... fanotify進入2.6.36。 – 2012-01-03 09:02:52

28

我使用inotifywait工具來完成類似的事情:

#!/bin/bash 
while true; do 

inotifywait -e modify,create,delete -r /path/to/your/dir && \ 
<some command to execute when a file event is recorded> 

done 

這將建立遞歸目錄手錶對整個樹,讓你當有些變化執行命令。如果您只想查看更改,可以添加-m標誌以將其置於監控模式。

+1

這比接受的答案更有幫助+1 – qed 2013-11-25 18:01:38

+2

爲避免'while循環'使用'-m'或'--monitor'開關/選項/標誌/ arg。不知道什麼時候該「開關」應運而生,但比循環更好 – gwillie 2017-03-11 10:06:26

+0

您還應該添加'move'事件: 'inotifywait -e修改,創建,刪除,移動-r/path/to/your/dir' – famzah 2017-07-18 09:19:41

3
$ inotifywait -m -r /path/to/your/directory 

這個命令是不夠遞歸地看目錄的所有活動,如訪問,打開,創建,刪除...

相關問題