1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

Go造运维之文件系统监控

Go造运维之文件系统监控

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

Go造运维之文件系统监控

如何实现文件系统监控

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