2014-11-14 42 views
0

我有一個小應用程序,它監視特定類型文件名(* .monitored)的目錄樹。它計算匹配文件的數量,使用inotify監視各種事件以匹配正在添加或刪除的文件,並且可以輪詢報告當前文件的數量,以及過去幾次文件添加和刪除的平均速率秒。目錄樹可以包含數十萬個文件,所以我試圖避免維護一個受監控文件的列表。Linux inotify事件重寫()覆蓋

如果我運行:

touch foo.monitored 

我得到IN_CREATE,我設置NUM_FILES = 1

touch foo.ignored 

我得到IN_CREATE,忽略它,並留下NUM_FILES = 1

mv foo.ignored foo.monitored 

生成:

IN_MOVE D_FROM爲foo.ignored,我忽略,所以num_files = 1

IN_MOVED_TO for foo.monitored我把它作爲一個新文件,所以設置num_files = 2,但是舊的foo.monitored已被覆蓋,所以我的總數是錯誤。

我找不到一個事件表明舊foo.monitored的消亡 - 有沒有辦法做我想要的,而沒有維護一個龐大的文件名結構?

謝謝!

+0

投票結束的人應該發表評論。這看起來像一個相當明確的問題。 – 2014-11-14 20:03:27

回答

0

不,inotify不會幫你在這裏。在這種情況下它不會發出刪除事件。

也許一個折中的解決方案是記錄每個目錄中有多少個受監視的文件,然後每次獲得模糊信號時都重新掃描一個目錄?

但是,使用inotify來監視目錄樹存在更大的問題。你有沒有考慮過如果一個包含數千個受監控文件的目錄被移入或移出你的樹會發生什麼?即使在樹中移動目錄也是有問題的。


編輯:其他的想法:

  1. 添加對每個文件的inotify的手錶,個別。這可能不是一個好計劃。

  2. 一個計數器在您閱讀時只能是準確的;任何讀取計數並希望與之後讀取的內容匹配的調用者都有一個令人討厭的競爭條件錯誤等待發生。因此,只要接受該櫃檯可能有點不妥,並且在您有機會時糾正該問題,或許可以。

  3. 每5個移動事件完成一次全面掃描。

  4. 移動事件後,等待30秒,看看是否有更多,只有然後進行掃描。

  5. 將樹分成多個部分(「桶」),並記錄每個部分的計數。這應該可以減少掃描開銷。

  6. 爲每個受監視的文件路徑記錄散列。這可能比記錄實際文件名更少的內存/麻煩。

+0

感謝 - 正如它發生的那樣,我可以很容易地處理目錄的進出,因爲目錄樹定義得很好(如squid緩存,dir/0/0/0/files,dir/0/0/1/files。 ..),我可以做一個完整的重新掃描,如果其中一個目錄被移入或移出,但如果我必須對每個IN_MOVED_TO進行全面掃描,我不妨使用inotify ... 你可以建議另一種方法? – 2014-11-27 12:16:01

+0

我想你可以在每個單獨的文件上設置一個inotify監視器,但所有可能的做法是將文件名存儲移動到其他位置(並且我不完全確定它會如何*然後執行)。 – ams 2014-11-27 12:24:21

+0

TBH,我會試圖證明在某些情況下文件數量可能只是大致正確,並且每當您進行完全重新掃描時都要更正您的計數。你說統計數據只是幾秒鐘的活動,這種情況可能很少見,所以這可能足夠好了?也許增加一個計數器,只要發生不明確的事情,然後觸發重新掃描,當它達到某個閾值? – ams 2014-11-27 12:27:05