使用 inotify 監控檔案系統的活動

2021-09-06 06:15:31 字數 2003 閱讀 7790

使用 inotify 監控檔案系統的活動

編寫自己的應用程式或使用開源工具套件

martin streicher , web 開發人員, 自由職業者

martin streicher 是一位自由 web 開發人員,並且是 linux magazine 的前任主編。martin 擁有 purdue university 電腦科學的碩士學位,並從 1986 年開始編寫 unix 風格的系統。他喜歡收藏藝術品和玩具。

簡介:inotify 是乙個 linux® 特性,它監控檔案系統操作,比如讀取、寫入和建立。inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。學習如何將 inotify 整合到您的應用程式中,並發現一組可用來進一步自動化系統管理的命令列工具。

標記本文!

發布日期:2008 年 10 月 13 日

級別:中級

其他語言版本:英文

平均分 (11個評分)

為本文評分

但奇怪的是,這些工具沒有乙個具有響應性。當然,您可以安排乙個頻繁執行的 cron 任務來監控條件,但這樣繁忙的輪詢 — 消耗大量資源並且具有不確定性 — 並不是很理想。例如,如果您必須監控輸入資料的幾個 transfer protocol(ftp)收存箱,您可能要通過find命令掃瞄每個目標目錄,列舉新的內容。然而,儘管這個操作看起來並沒有什麼害處,但每個呼叫都產生乙個新的 shell 和find命令,這需要許多系統呼叫來開啟目錄,然後掃瞄目錄,等等。這會造成過於頻繁的或大量的輪詢任務(更糟糕的是,繁忙的輪詢並不總是很好。想象一下乙個檔案系統瀏覽器,比如 mac os x 的 finder,輪詢更新時需要的大量資源及其複雜性)。

那麼,管理員應該怎麼辦呢?令人高興的是,您可以再次求助於可以信賴的計算機。

了解 inotify

使用 inotify 很簡單:建立乙個檔案描述符,附加乙個或多個監視器(乙個監視器 是乙個路徑和一組事件),然後使用read()方法從描述符獲取事件資訊。read()並不會用光整個週期,它在事件發生之前是被阻塞的。

更好的是,因為 inotify 通過傳統的檔案描述符工作,您可以利用傳統的select()系統呼叫來被動地監控監視器和許多其他輸入源。兩種方法 — 阻塞檔案描述符和使用select()— 都避免了繁忙輪詢。

現在,讓我們深入了解 inotify,寫一些 c **,然後看看一組命令列工具,您可以構建並使用它們將命令和指令碼附加到檔案系統事件。inotify 不會在中途失去控制,但它可以執行catwget,並且在必要時嚴格執行。

要使用 inotify,您必須具備一台帶有 2.6.13 或更新核心的 linux 機器(以前的 linux 核心版本使用更低階的檔案監控器 dnotify)。如果您不知道核心的版本,請轉到 shell,輸入uname -a

%uname -alinux ubuntu-desktop 2.6.24-19-generic #1 smp ... i686 gnu/linux
如果列出的核心版本不低於 2.6.13,您的系統就支援 inotify。您還可以檢查機器的 /usr/include/sys/inotify.h 檔案。如果它存在,表明您的核心支援 inotify。

注意:freebsd 和 mac os x 提供乙個類似於 inotify 的 kqueue。在 freebsd 機器上輸入man 2 kqueue獲取更多資訊。

本文基於 ubuntu desktop version 8.04.1(即 hardy),它執行在 mac os x version 10.5 leopard 的 parallels desktop version 3.0。

inotify非同步檔案實時監控

inotify是linux核心提供的一組系統呼叫,它可以監控檔案系統操作,比如檔案或者目錄的建立 讀取 寫入 許可權修改和刪除等。inotify使用也很簡單,使用inotify init建立乙個控制代碼,然後通過inotify add watch inotify rm watch增加 刪除對檔案和目...

使用pyinotify監控檔案系統變化

import pyinotify wm pyinotify.watchmanager 建立乙個wachmanager物件 mask pyinotify.in create pyinotify.in delete 建立要監控的事件,這裡是監控建立檔案與刪除檔案事件 wm.add watch 要監控的檔...

82 2 監控檔案系統

誰開啟了該檔案?顯示開啟檔案filename的程序 lsof filename列出某個目錄下被開啟的檔案 lsof tmp command pid user fd type device size off node name seahorse 4158 neo cwd dir 8,2 53248 1...