Go造运维之文件系统监控
我是本际云服务器推荐网的小编小本本,今天为大家介绍文件系统监控。在运维场景中,我们有时需要对某个配置文件或者某个目录进行watch监控,以便获取变更信息并进行下一步处理。基于开源项目https://github.com/fsnotify/fsnotify,我们可以实现文件系统监控功能。

如何实现文件系统监控
FSNotify可以支持跨平台文件系统watcher实现。在不同平台基于不同的调度器实现,目前已经实现的调度器有:
AdapterOSExisting Implementation
- inotify(Linux,Android)
- kqueue(BSD,macOS,iOS)
- ReadDirectoryChangesW(Windows)
这些调度器支持各种操作:
- inotify
- kqueue
- ReadDirectoryChangesW
基于FSNotify可以实现的功能:
- 文件修改、删除、读取监控
- 目录下新增、修改、删除、读取监控
文件和目录的监控结合安全堡垒设备和告警平台,可以实现对敏感文件/目录操作的溯源、告警。下面提供代码实现。
文件监控代码实现示例
以下Go语言代码示例实现了对文件进行watch监控,当对文件进行增删改操作时,会触发相应的events。在实际环境中,可以将这些events的信息传递到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\n", event.Name)
switch event.Op {
case fsnotify.Create:
log.Printf("Create File: %s\n", event.Name)
case fsnotify.Write:
log.Printf("Write File: %s\n", event.Name)
case fsnotify.Remove, fsnotify.Rename:
log.Printf("Remove or Delete File: %s\n", event.Name)
//重新添加watcher
log.Printf("AddWatchFile:%s\n", event.Name)
//文件被remove后会丢失描述符,需要重新watcher才能重新获取
err = watcher.Add(event.Name)
if err != nil {
log.Fatal(err)
}
case fsnotify.Chmod:
log.Printf("ChmodFile: %s\n",event.Name)
}
case err:= <-watcher.Errors:
log.Println(err)
}
}()
//对/etc/shadow和/etc/passwd文件进行watcher
fileArray := [2]string{"/etc/shadow", "/etc/passwd"}
for _,f := range fileArray {
fmt.Printf("AddWatchFIle: %s\n", f)
watcher.Add(f)
}
//等待
select {}
}
文件系统监控实践
我们可以使用ioutil和ReadDir模拟inotify检测目录监视创建的文件的能力。在Linux环境中实现对文件系统的watcher还需要确认以下Linux内核参数是否配置:
通过sysctl-a获取内核参数,max_user_watches>=8192, max_queued_events>=16384
以上是Go造运维之文件系统监控的全部内容。希望本文能对您的学习或者工作带来一些帮助。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5986.html
