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/。