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实现,在不同平台基于不同的调度器实现,目前已经实现的调度器有

AdapterOSExisting Implementation
inotifyLinux, Android支持
kqueueBSD, macOS, iOS*支持
ReadDirectoryChangesWWindows支持

各个调度器实现的op

  • inotify
fsnotify OpEVFILT_VNODEDescription
DeleteIN_DELETE_SELF监视文件/目录本身被删除
RenameIN_MOVE_SELF监视文件/目录本身被移动
IN_ACCESS访问(读取)文件
ChmodIN_ATTRIB元数据更改了——权限、时间戳、扩展属性、链接计数、UID或GID
IN_CLOSE_WRITE打开待写的文件已关闭
IN_CLOSE_NOWRITE未打开待写入的文件已关闭
CreateIN_CREATE在watcher目录中创建的文件/目录
IN_MOVED_TO当文件重命名时,为包含新文件名的目录生成
IN_OPEN文件打开
RemoveIN_DELETE从watch目录中删除文件/目录
WriteIN_MODIFY文件被修改
RenameIN_MOVED_FROM重命名文件时,为包含旧文件名的目录生成
  • kqueue
fsnotify OpEVFILT_VNODEDescription
RemoveNOTE_DELETE对描述符所引用的文件调用unlink()系统调用
WriteNOTE_WRITE描述符引用的文件发生了写操作
NOTE_EXTEND描述符引用的文件被扩展。(大小增加)
ChmodNOTE_ATTRIB描述符引用的文件的属性发生了变化.
NOTE_LINK文件上的链接数改变了
RenameNOTE_RENAME描述符引用的文件被重命名
NOTE_REVOKE对文件的访问被撤销,或者底层文件系统被卸载
CreateN/Afsnotify使用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