# Go造运维之文件系统监控

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 其他
> 标签: AI, 安全, Linux
> 原文链接: http://117.50.162.249:3000/yun/articles/910

---

# Go造运维之文件系统监控

> 来源: 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/安全堡垒设备,告警平台 实现对敏感文件/目录操作的溯源,告警

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129968/images/129968_000.png)

**附代码实现对文件监控**

代码实现了对文件进行watcher监控,当对文件继续增删改的时候会触发响应的events,实际环境中对这些触发的events可将event信息传递给kafka这类消息队列,本段代码只是一个示例

另外当文件被recreate时候,watcher会丢失文件描述符信息,需要在代码层实现对文件的重新watcher。

```
package main
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129968/images/129968_001.png)

END

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129968/images/129968_002.png)