Go造运维之文件系统监控
AI 摘要 / TL;DR
Go造运维之文件系统监控 运维场景中,有时候需要对某个配置文件,或者某个目录进行watch监控,当发生变更行为时候能获取变更信息进行下一步处理。 基于开源项目https://github.com/fsnotify/fsnotify我们可以实现对文件系统监控功能。 fsnotify可以支持跨平台文件系统watcher实现
来源: https://www.ucloud.cn/yun/129968.html 作者: IT那活儿 发布日期: 发布于2023-01-11 13:20
Go造运维之文件系统监控
运维场景中,有时候需要对某个配置文件,或者某个目录进行watch监控,当发生变更行为时候能获取变更信息进行下一步处理。
基于开源项目https://github.com/fsnotify/fsnotify我们可以实现对文件系统监控功能。
fsnotify可以支持跨平台文件系统watcher实现,在不同平台基于不同的调度器实现,目前已经实现的调度器有
| Adapter | OS | Existing Implementation |
|---|---|---|
| inotify | Linux, Android | 支持 |
| kqueue | BSD, macOS, iOS* | 支持 |
| ReadDirectoryChangesW | Windows | 支持 |
各个调度器实现的op
- inotify
| fsnotify Op | EVFILT_VNODE | Description |
|---|---|---|
| Delete | IN_DELETE_SELF | 监视文件/目录本身被删除 |
| Rename | IN_MOVE_SELF | 监视文件/目录本身被移动 |
| IN_ACCESS | 访问(读取)文件 | |
| Chmod | IN_ATTRIB | 元数据更改了——权限、时间戳、扩展属性、链接计数、UID或GID |
| IN_CLOSE_WRITE | 打开待写的文件已关闭 | |
| IN_CLOSE_NOWRITE | 未打开待写入的文件已关闭 | |
| Create | IN_CREATE | 在watcher目录中创建的文件/目录 |
| IN_MOVED_TO | 当文件重命名时,为包含新文件名的目录生成 | |
| IN_OPEN | 文件打开 | |
| Remove | IN_DELETE | 从watch目录中删除文件/目录 |
| Write | IN_MODIFY | 文件被修改 |
| Rename | IN_MOVED_FROM | 重命名文件时,为包含旧文件名的目录生成 |
- kqueue
| fsnotify Op | EVFILT_VNODE | Description |
|---|---|---|
| Remove | NOTE_DELETE | 对描述符所引用的文件调用unlink()系统调用 |
| Write | NOTE_WRITE | 描述符引用的文件发生了写操作 |
| NOTE_EXTEND | 描述符引用的文件被扩展。(大小增加) | |
| Chmod | NOTE_ATTRIB | 描述符引用的文件的属性发生了变化. |
| NOTE_LINK | 文件上的链接数改变了 | |
| Rename | NOTE_RENAME | 描述符引用的文件被重命名 |
| NOTE_REVOKE | 对文件的访问被撤销,或者底层文件系统被卸载 | |
| Create | N/A | fsnotify使用ioutil,ReadDir来模拟inotify检测目录监视创建的文件的能力. |
linux环境要实现对文件系统的watcher还需要确认以下linux内核参数是否配置
# 通过sysctl -a 获取内核参数, max_user_watches>=8192 ,max_queued_events>=16384
基于fsnotify可以实现的功能
- 文件修改,删除,读取监控
- 目录下新增,修改,删除,读取监控
- 结合4A/安全堡垒设备,告警平台 实现对敏感文件/目录操作的溯源,告警

附代码实现对文件监控
代码实现了对文件进行watcher监控,当对文件继续增删改的时候会触发响应的events,实际环境中对这些触发的events可将event信息传递给kafka这类消息队列,本段代码只是一个示例
另外当文件被recreate时候,watcher会丢失文件描述符信息,需要在代码层实现对文件的重新watcher。
package main

END
