运维场景中,有时候需要对某个配置文件,或者某个目录进行watch监控,当发生变更行为时候能获取变更信息进行下一步处理。
基于开源项目https://github.com/fsnotify/fsnotify我们可以实现对文件系统监控功能。
fsnotify可以支持跨平台文件系统watcher实现,在不同平台基于不同的调度器实现,目前已经实现的调度器有
Adapter | OS | Existing Implementation |
inotify | Linux, Android | 支持 |
kqueue | BSD, macOS, iOS* | 支持 |
ReadDirectoryChangesW | Windows | 支持 |
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
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
#也可以访问 /proc/sys/fs/inotify 路径查看
基于fsnotify可以实现的功能
文件修改,删除,读取监控
目录下新增,修改,删除,读取监控
结合4A/安全堡垒设备,告警平台 实现对敏感文件/目录操作的溯源,告警
附代码实现对文件监控
代码实现了对文件进行watcher监控,当对文件继续增删改的时候会触发响应的events,实际环境中对这些触发的events可将event信息传递给kafka这类消息队列,本段代码只是一个示例
另外当文件被recreate时候,watcher会丢失文件描述符信息,需要在代码层实现对文件的重新watcher。
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/fsnotify/fsnotify"
)
func main() {
monitorDir()
}
func monitorDir() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
go func() {
for {
select {
case event := <-watcher.Events:
fmt.Printf("New watch File: %s ", event.Name)
switch event.Op {
case fsnotify.Create:
log.Printf("Create File:%s ", event.Name)
case fsnotify.Write:
log.Printf("Write File:%s ", event.Name)
case fsnotify.Remove, fsnotify.Rename:
log.Printf("Remove or Delete File:%s ", event.Name)
//重新添加watch
log.Printf("Add Watch File:%s ", event.Name)
// 文件被remove后会丢失描述符,需要重新watcher才能重新获取
err = watcher.Add(event.Name)
if err != nil {
log.Fatal(err)
}
case fsnotify.Chmod:
log.Printf("Chmod File:%s ", event.Name)
}
case err := <-watcher.Errors:
log.Println(err)
}
}
}()
// log.Printf("Add New Watch File:%s")
// 对/etc/shadow /etc/passwd 文件进行watcher
fileArray := [2]string{"/etc/shadow", "/etc/passwd"}
for _, f := range fileArray {
fmt.Printf("Add Watch FIle:%s ", f)
watcher.Add(f)
}
// waiting
select {}
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129968.html
摘要:目前,高德主要有地图导航两个产品,以及地图,同时还开放了服务,方便移动开发者更好地为用户提供高质量基于位置的服务。另外,高德经常有大型活动,用户访问量会在某个阶段激增,这时就需基于阿里云的弹性伸缩服务,就能实现快速扩展的基础设施。 摘要: 云计算带来的变革不言而喻,作为一种新型的IT交付模式,切实为企业节省IT成本、加快IT与企业业务结合效率、提升创新能力、加强管理水平以及增强系统本身...
阅读 1348·2023-01-11 13:20
阅读 1687·2023-01-11 13:20
阅读 1136·2023-01-11 13:20
阅读 1863·2023-01-11 13:20
阅读 4104·2023-01-11 13:20
阅读 2708·2023-01-11 13:20
阅读 1388·2023-01-11 13:20
阅读 3600·2023-01-11 13:20