Inotify 是Linux核心子系统之一,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
Inotify 是 Linux 核心子系统之一,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
Inotify 能够监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。
优点
相较于被 inotify 取代较旧的 dnotify 模组,inotify 有诸多益处。在旧的模组中,程式必须为每一个被监控的目录建立 file descriptor,这种作法很容易让行程拥有的 file descriptor 逼近系统允许的上限,进而形成瓶颈。dnotify 产生的 file decriptor 也会导致系统资源忙碌,使可移除装置无法被移除,徒增使用上的困扰。
由于 dnotify 只能让程式设计师监控目录层级的变化,「精细度」亦是“dnotify”的劣势之一。为此,程式设计师必须付出额外的心力,自行撰写程式码以期追踪更细微的档案系统事件。
inotify 相较之下使用较少的 file descriptor,亦允许 select()与 poll()介面,优于 dnotify 使用的信号系统。这也使得 inotify 与既有以 select()或 poll()为基础之函式库(如:Glib )整合更加便利。
inotify 的原始开发者为 John McCutchan、罗伯特·拉姆与 Amy Griffis。于 Linux 核心 2.6.13 发行时(2005 年六月十八日),被正式纳入 Linux 核心。尽管如此,它仍可透过修补程式的方式与 2.6.12 甚至更早期的 Linux 核心整合。
inotify 的主要应用于桌面搜索软体,像:Beagle,得以针对有变动的档案重新索引,而不必没有效率地每隔几分钟就要扫描整个档案系统。相较于主动轮询档案系统,透过作业系统主动告知档案异动的方式,让 Beagle 等软体甚至可以在档案更动后一秒内更新索引。
此外,诸如:更新目录检视、重新载入设定档、追踪变更、备份、同步甚至上传等许多自动化作业流程,都可因而受惠。
历史简介
在 inotify 之前有 dnotify。不幸的是,dnotify 有局限性,用户需要更好的产品。和 dnotify 相比 inotify 的优势如下:
- Inotify 使用一个独立的文件描述符,而 dnotify 需要为每个受监控的目录打开一个文件描述符。当您同时监控多个目录时成本会非常高,而且还会遇到每进程文件描述符限制。
- Inotify 所使用的文件描述符可以通过系统调用获得,并且没有相关设备或者文件。而使用 dnotify,文件描述符就固定了目录,妨碍备用设备卸载,这是可移动媒体的一个典型问题。对于 inotify,卸载的文件系统上的监视文件或目录会产生一个事件,而且监视也会自动移除。
- Inotify 能够监视文件或者目录。Dnotify 则只监视目录,因此程序员还必须保持 stat 结构或者一个等效的数据结构,来反映该被监视目录中的文件,然后在一个事件发生时,将其与当前状态进行对比,以此了解当前目录中的条目发生了什么情况。
- 如上所述,inotify 使用文件描述符,允许程序员使用标准 select 或者 poll 函数来监视事件。这允许高效的多路复用 I/O 或者与 Glib 的 mainloop 的集成。相比之下,dnotify 使用信号,这使得程序员觉得比较困难或者不够流畅。在 2.6.25 内核中 inotify 还添加了 Signal-drive I.O 通知功能。
应用到性能监控、程序调试、以及自动化等领域时,inotify 是监控 Linux 文件系统的功能强大的、高粒度的机制。利用本文提供的样例代码,您可以开始编写用来实时记录文件系统事件并最小化性能开销的应用程序。
文章来自互联网,只做分享使用。发布者:给个机会君,转载请注明出处:https://www.baoxiaoke.com/article/195180.html