资讯专栏INFORMATION COLUMN

Go造运维之文件系统监控

IT那活儿 / 1075人阅读
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>=16384fs.inotify.max_queued_events = 16384fs.inotify.max_user_instances = 128fs.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 {}}


END



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129968.html

相关文章

  • 高德地图基于阿里云MaxCompute的最佳实践

    摘要:目前,高德主要有地图导航两个产品,以及地图,同时还开放了服务,方便移动开发者更好地为用户提供高质量基于位置的服务。另外,高德经常有大型活动,用户访问量会在某个阶段激增,这时就需基于阿里云的弹性伸缩服务,就能实现快速扩展的基础设施。 摘要: 云计算带来的变革不言而喻,作为一种新型的IT交付模式,切实为企业节省IT成本、加快IT与企业业务结合效率、提升创新能力、加强管理水平以及增强系统本身...

    masturbator 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<