fswatch
是一個檔案變更監視器,當指定檔案或目錄的內容被修改時,它會收到通知。 fswatch
實作了多個監視器:
stat (2)
地方工作)。 fswatch
應該在任何包含上述 API 的系統上建置並正常運作。
fswatch
是libfswatch
的前端,libfswatch 是一個具有 C 和 C++ 綁定的函式庫。有關libfswatch
的更多資訊可以在此處找到。
fswatch
主要特點是:
fswatch
的限制很大程度上取決於所使用的監視器:
FSEvents監視器僅在 macOS 上可用,沒有已知的限制,並且可以根據觀察的檔案數量很好地擴展。
Solaris 核心及其衍生版本上提供的檔案事件通知監視器沒有已知的限制。
kqueue監視器可在任何具有 kqueue 功能的 *BSD 系統上使用,需要為每個正在監視的檔案開啟一個檔案描述符。因此,此監視器隨著所觀察到的檔案數量的增加而嚴重擴展,一旦fswatch
進程用完檔案描述符,就可能開始出現異常行為。在這種情況下, fswatch
會為每個無法開啟的檔案轉儲一個標準錯誤錯誤。
inotify監視器自核心 2.6.13 起在 Linux 上可用,如果事件產生速度快於從佇列讀取事件的速度,則可能會出現佇列溢位。無論如何,應用程式保證收到溢出通知,可以對其進行處理以正常恢復。目前,如果發生佇列溢出, fswatch
會引發異常。未來的版本將透過發出適當的通知來處理溢出。
Windows監視器只能建立監視目錄,無法建立檔案。若要監視文件,必須監視其父目錄,以便在任意深度遞歸地接收該目錄的所有子目錄的變更事件。或者,可以過濾更改事件以僅包括對所需文件的更改。
輪詢監視器可在任何平台上使用,僅依賴可用的 CPU 和記憶體來執行其任務。該監視器的效能隨著正在監視的檔案數量線性下降。
使用建議如下:
在 macOS 上,僅使用FSEvents
監視器(這是預設行為)。
在 Solaris 及其衍生版本上,使用文件事件通知監視器。
在 Linux 上,使用inotify
監視器(這是預設行為)。
如果要觀察的檔案數量夠小,請使用kqueue
監視器。請注意,在某些系統上,進程可以開啟的檔案描述符的最大數量設定為非常低的值(低至 256 的值並不罕見),即使作業系統可能允許更大的值。在這種情況下,請檢查作業系統文件以在每個進程或系統範圍內提高此限制。
如果可行,請查看目錄而不是檔案。正確設計事件的接收端來處理目錄可能會顯著減少監視器資源消耗。
在 Windows 上,使用windows
監視器。
如果以上都不適用,請使用輪詢監視器。作者的經驗表明, fswatch
需要大約 150 MB RAM 記憶體來觀察 500.000 個檔案的層次結構,最小路徑長度為 32 個字元。輪詢監視器的一個常見瓶頸是磁碟訪問,因為stat()
處理大量檔案可能會花費大量時間。在這種情況下,延遲應設定為足夠大的值,以減少頻繁磁碟存取可能導致的效能下降。
一般使用者可能能夠從作業系統或第三方作業系統的套件管理器中取得fswatch
。如果您正在尋找適用於 macOS 的fswatch
,可以使用 MacPorts 或 Homebrew 安裝它:
# MacPorts
$ port install fswatch
# Homebrew
$ brew install fswatch
在 FreeBSD 上,可以使用 pkg 安裝fswatch
:
# pkg install fswatch-mon
檢查您最喜歡的套件管理器,如果fswatch
丟失,請告訴我們。
希望建構fswatch
的用戶應該獲得發布 tarball。發布 tarball 包含使用者在其係統上建置fswatch
所需的所有內容,請按照下面的安裝部分和INSTALL
檔案中詳細說明進行操作。
希望修改fswatch
的開發人員應該獲取原始程式碼(從原始碼 tarball 或克隆儲存庫)並在其電腦上安裝 GNU 建置系統。請閱讀README.gnu-build-system
以取得有關如何從電腦上的來源引導fswatch
更多詳細資訊。
不建議取得來源儲存庫的副本,除非您是開發人員,您的電腦上安裝了 GNU 建置系統,並且您知道如何在來源上引導它。
有關如何設定和安裝fswatch
詳細信息,請參閱INSTALL
檔案。由於fswatch
建置並使用動態庫,因此在某些平台中,您可能需要執行其他任務才能使用fswatch
:
確保動態函式庫的安裝目錄( $PREFIX/lib
)包含在作業系統的動態連結器的尋找路徑中。預設路徑/usr/local/lib
幾乎適用於所有作業系統。
可能需要刷新動態庫的連結和快取。在 GNU/Linux 系統中,您可能需要執行ldconfig
:
$ ldconfig
fswatch
是 C++ 程序,需要符合 C++11 標準的 C++ 編譯器來編譯它。檢查作業系統文檔,以了解有關如何安裝 C++ 工具鍊和 C++ 運行時的資訊。
除了檔案系統監視器使用的上述 API 之外,不需要其他軟體包或依賴項來設定和安裝fswatch
。
fswatch
提供以下文件:
fswatch
官方文件以 Texinfo 格式提供。這是關於fswatch
的最全面的資訊來源,也是唯一權威的資訊來源。特別是,手冊頁是一個建議使用者使用資訊頁的存根。
如果您使用套件管理器安裝fswatch
並且希望將 PDF 手冊捆綁到套件中,請向套件維護者發送功能請求。
fswatch
是可在地化的,並在內部使用 GNU gettext
將可本地化字串與其翻譯分離。目前可用的區域設定有:
en
)。it
)。es
)。要建立具有本地化支援的fswatch
,您需要在系統上安裝gettext
。如果configure
找不到
或連結器找不到libintl
,那麼您可能需要手動提供它們的位置來configure
,通常使用CPPFLAGS
和LDFLAGS
變數。有關範例,請參閱README.macos
。
如果gettext
在您的系統上不可用, fswatch
將正確構建,但它將缺乏本地化支持,並且唯一可用的區域設定將是英語。
fswatch
接受應接收更改事件的路徑清單:
$ fswatch [options] ... path-0 ... path-n
即使任何路徑尚不存在,也會建立事件流。如果它們是在fswatch
啟動後建立的,則將正確接收更改事件。根據所使用的觀察程序,在配置的延遲時間過後,將監視新建立的路徑。
fswatch
的輸出可以透過管道傳輸到其他程式以便進一步處理:
$ fswatch -0 path | while read -d "" event
do
// do something with ${event}
done
要在一組更改事件列印到標準輸出但不需要事件詳細資訊時執行命令,可以使用以下命令:
$ fswatch -o path | xargs -n1 -I{} program
行為與早期版本的fswatch
(v. 0.x) 一致。請閱讀fswatch v.0.x 的兼容性問題部分以獲取更多資訊。
預設情況下, fswatch
選擇目前平台上在效能和資源消耗方面可用的最佳監視器。如果使用者希望指定不同的監視器,可以使用-m
選項按名稱指定監視器:
$ fswatch -m kqueue_monitor path
可以使用-h
選項取得可用監視器的清單。
有關更多信息,請參閱fswatch
文件。
歡迎大家為fswatch
做出貢獻。請參閱CONTRIBUTING
以獲取更多資訊。
錯誤報告可以直接發送給作者。
可以使用 Freenode #fswatch
頻道在 IRC 上聯絡作者。
該軟體根據 GPL v.3.0 和 Apache License v.2.0 獲得雙重授權。
版權所有 (c) 2013-2021 Enrico M. Crisostomo
該程式是免費軟體;您可以根據自由軟體基金會發布的 GNU 通用公共授權的條款重新分發和/或修改它;版本 3 或(由您選擇)任何更高版本。
分發此程序的目的是希望它有用,但不提供任何保證;甚至沒有適銷性或特定用途適用性的默示保證。有關更多詳細信息,請參閱 GNU 通用公共許可證。
您應該隨該程式一起收到 GNU 通用公共授權的副本。如果沒有,請參閱 http://www.gnu.org/licenses/。