Linux 磁盘监控
使用 rust 实现一个 Linux 版本的磁盘监控, 调查看的话, 可能 fanotify 会更合适, 因为它会报告 pid 等额外信息.
参考
简介
如果用户需要高优先级地处理某些文件, 一个办法是使用 cron 来 poll 它. 但这样做效率不高, 可能造成太多的 polling 事件被高频率 fork.
Linux 有一个高效的办法: inotify
系统调用.
并且还有许多成熟的 shell 实用工具或 daemon 来注册文件系统监听然后报告文件系统改变事件. systemd
实际上也具有基础的 inotify 功能(基于 path units).
inotify
有一些限制:
- 不能监听远程/网络文件系统(NFS)
- 它也不能报告事件关联的 userid/pid 等, 如果需要 pid, 则需要使用
fanotify
- 它不能和
/proc
或其他的虚拟文件系统协作 mmap
对文件的操作也不会触发它.
因此针对目前需求, 恰当的选择是 fanotify
相关的调用, 相见它的 man page
头文件
头文件中 linux 仓库中: inotify.h
和 fsevent 类似, 它也需要通过 ioctl 复制固定的文件描述符. 它也是通过读取特殊设备文件来完成监听的. 但获取描述符的时候不需要手动指定文件路径, 而是使用 inotify_init
获取文件描述符.