Inotify 是一個 Linux 特性,它監控檔案系統操作,比如讀取、寫入和創建。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。將 inotify 集成到應用程式中,並發現一組可用來進一步自動化系統管理的命令行工具。
產生背景
系統管理就像日常生活一樣。就像刷牙和吃蔬菜一樣,日常的維護能保持機器的良好狀態。必須定期清空廢物,比如臨時檔案或無用的日誌檔案,以及花時間填寫表單、回復電話、下載更新和監控進程等。幸好自動化 shell 腳本、使用 Nagios 等工具進行監控、通過常見的 cron 進行任務調度可以減輕這個負擔。
但奇怪的是,這些工具沒有一個具有回響性。當然,可以安排一個頻繁運行的 cron 任務來監控條件,但這樣繁忙的輪詢 — 消耗大量資源並且具有不確定性 — 並不是很理想。例如,如果必須監控輸入數據的幾個 Transfer Protocol(FTP)收存箱,可能要通過 find 命令掃描每個目標目錄,列舉新的內容。然而,儘管這個操作看起來並沒有什麼害處,但每個調用都產生一個新的 shell 和 find 命令,這需要許多系統調用來打開目錄,然後掃描目錄,等等。這會造成過於頻繁的或大量的輪詢任務(更糟糕的是,繁忙的輪詢並不總是很好。想像一下一個檔案系統瀏覽器,比如 Mac OS X 的 Finder,輪詢更新時需要的大量資源及其複雜性)。
那么,管理員應該怎么辦呢?令人高興的是,您可以再次求助於可以信賴的計算機。
了解 inotify
Inotify 是一個 Linux 核心特性,它監控檔案系統,並且及時向專門的應用程式發出相關的事件警告,比如刪除、讀、寫和卸載操作等。還可以跟蹤活動的源頭和目標等細節。
使用 inotify 很簡單:創建一個檔案描述符,附加一個或多個監視器(一個監視器是一個路徑和一組事件),然後使用 read() 方法從描述符獲取事件信息。read() 並不會用光整個周期,它在事件發生之前是被阻塞的。
更好的是,因為 inotify 通過傳統的檔案描述符工作,可以利用傳統的 select() 系統調用來被動地監控監視器和許多其他輸入源。兩種方法 — 阻塞檔案描述符和使用 select() 都避免了繁忙輪詢。
現在,深入了解 inotify,寫一些 C 代碼,然後看看一組命令行工具,可以構建並使用它們將命令和腳本附加到檔案系統事件。Inotify 不會在中途失去控制,但它可以運行 cat 和 wget,並且在必要時嚴格執行。
要使用 inotify,必須具備一台帶有 2.6.13 或更新核心的 Linux 機器(以前的 Linux 核心版本使用更低級的檔案監控器 dnotify)。如果不知道核心的版本,請轉到 shell,輸入 uname -a:
% uname -a
Linux 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。