使用golang实现目录的监控过程(代码片段)

gpan gpan     2023-01-03     488

关键词:

GO实现文件夹监控

收获

  • 查看 watcher.go, 看出实现一个系统event的监控,代码不过 625行;
  • 执行exec.Cmd(), cmd.Run(), 可以获得shell的执行状态;
  • 开始阅读github上的开源代码, 代码特别精简;

说明

项目组有一个需求,即当团队人员更新Gitbook到服务器的时候,服务器的gitbook目录下需要pull操作;

通过了解,当成员提交push内容到服务器的时候, git/objects目录下内容会create, modify, access等事件;

前期通过shell+inotifywait实现,但是总存在push的时候获取不到,或者上push之后频繁更新gitbook;

本次使用 github.com/radovskyb/watcher 来使用;

其中在本地执行如下命令, 获取watcher的库;

go get github.com/radovskyb/watcher

通过范例,结合自己的脚本 pull.book.sh; 完成git book的操作;


package main

import (
    "fmt"
    "log"
    "os/exec"
    "time"

    "github.com/radovskyb/watcher"
)

func main() 
    w := watcher.New()

    // SetMaxEvents to 1 to allow at most 1 event‘s to be received
    // on the Event channel per watching cycle.
    //
    // If SetMaxEvents is not set, the default is to send all events.
    w.SetMaxEvents(1)

    // Only notify rename and move events.
    //  w.FilterOps(watcher.Rename, watcher.Move)
    w.FilterOps(watcher.Create, watcher.Write, watcher.Chmod)

    go func() 
        for 
            select 
            case event := <-w.Event:
                fmt.Println(event) // Print the event‘s info.
                c := "pull.book.sh"
                cmd := exec.Command(c, "")
                err := cmd.Run()
                fmt.Printf("Command finished with error: %v
", err)
            case err := <-w.Error:
                log.Fatalln(err)
            case <-w.Closed:
                return
            
        
    ()

    // Watch this folder for changes.
    if err := w.Add("/srv/git/objects"); err != nil 
        log.Fatalln(err)
    

    // Watch test_folder recursively for changes.
    if err := w.AddRecursive("/srv/git/objects"); err != nil 
        log.Fatalln(err)
    

  /*
    // Print a list of all of the files and folders currently
    // being watched and their paths.
       for path, f := range w.WatchedFiles() 
         fmt.Printf("%s: %s
", path, f.Name())
       

       fmt.Println()
    */

    // Trigger 2 events after watcher started.
    go func() 
        w.Wait()
        w.TriggerEvent(watcher.Create, nil)
        w.TriggerEvent(watcher.Write, nil)
        w.TriggerEvent(watcher.Chmod, nil)
    ()

    // Start the watching process - it‘ll check for changes every 100ms.
    if err := w.Start(time.Millisecond * 100); err != nil 
        log.Fatalln(err)
    

使用ebpf监控golang应用(代码片段)

一、背景使用ebpf监控grpc-go的应用,grpc-gohttp2client的处理点func(l*loopyWriter)writeHeader(streamIDuint32,endStreambool,hf[]hpack.HeaderField,onWritefunc())error......//operateHeaderstakesactiononthedecodedheaders.func(t*http2Client)operateHeaders(frame*http2.MetaHeadersFrame)... 查看详情

文件监控——readdirecotrychangesw(代码片段)

实现原理:  实现文件监控操作的核心函数是ReadDirecotryChangesW。这个API函数可以设置监控目录、过滤条件,从而获取监控数据。在调用API函数ReadDirecotryChangesW设置监控过滤条件之前,需要先通过CreateFile函数打开监控目录,获... 查看详情

文件监控——readdirecotrychangesw(代码片段)

实现原理:  实现文件监控操作的核心函数是ReadDirecotryChangesW。这个API函数可以设置监控目录、过滤条件,从而获取监控数据。在调用API函数ReadDirecotryChangesW设置监控过滤条件之前,需要先通过CreateFile函数打开监控目录,获... 查看详情

性能监控之golang应用接入prometheus监控(代码片段)

...g库用于采集并暴露监控数据,本文快速为你介绍如何使用官方版Golang库来暴露Golangruntime相关的数据,以及其它一些基本简单的示例,并使用Prometheus监控服务来采集指标展示数据。​TIPS:有关全面的API文档,请参... 查看详情

容器云平台监控告警体系——golang应用接入prometheus(代码片段)

1、概述  目前容器云平台中的容器仅支持获取CPU使用率、内存使用率、网络流入速率和网络流出速率这4个指标,如果想监控应用程序的性能指标或者想更加细粒度的监控应用程序的运行状态指标的话,则需要在应用程序中内... 查看详情

golang的面向对象实现(代码片段)

GoLang的面向对象通过golang实现面向对象的过程,以及golang的继承关系定义了动物,定义了鸟类,鱼类,最后的对象是燕子,Nimopackagemainimport"fmt"typeAnimalinterfaceEat()Play()typeanimalstructnamestringtypeBirdinterfaceAnimal//匿名嵌入接口Fly()typebird... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

使用golang实现简易的令牌桶算法(代码片段)

...据的发送。令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗& 查看详情

golang实现binarysearch(代码片段)

二分查找法golang收获获取随机数,先设置一个随机时间rand.Seed(time.Now()).UnixNano()),然后执行rand.Intn(2<<16)可以获得随机数;递归的实现,针对二分查找过程应该数(](]的区间,中间一个数<=,然后是<算法执行过程通过一个数... 查看详情

golang实践录:ssh及scp的实现(代码片段)

本文介绍golang的scp实现和使用。问题提出工作中经常要查询日志,一般情况下需使用堡垒机登陆到远程机器,确认日志位置、文件名称,再用winscp软件下载,这过程比较繁琐,为节省时间,考虑用golang实现... 查看详情

golang实践录:ssh及scp的实现(代码片段)

本文介绍golang的scp实现和使用。问题提出工作中经常要查询日志,一般情况下需使用堡垒机登陆到远程机器,确认日志位置、文件名称,再用winscp软件下载,这过程比较繁琐,为节省时间,考虑用golang实现... 查看详情

golang递归获取目录下所有文件(代码片段)

...献1.问题如果我想获取一个目录下的所有文件列表,使用Golang该如何实现呢?比如有个目录dir结构如下:treedirdir├──bar.txt├──foo.txt└──subdir└──baz.txt那么如何获取dir目录下的 查看详情

go-zero微服务框架rpc的使用(代码片段)

...端状态上送监控服务为例,记录下go-zero微服务的简单使用,实现一个简易的后台监控云服务,监控所有出厂状态上报的终端状态。新建一个Golang服务后台项目代码的目录, 查看详情

golang泛型实现类型转换(代码片段)

文章目录1.前言2.ToString3.ToOtherType3.泛型4.使用示例5.go-huge-util参考文献1.前言Golang标准库提供了很多类型转换的函数,如strconv包可完成string与基本数据类型之间的转换。比如将int与string之间的互转。//inttostrings:=strconv.Itoa(i)/... 查看详情

golang泛型实现类型转换(代码片段)

文章目录1.前言2.ToString3.ToOtherType3.泛型4.使用示例5.go-huge-util参考文献1.前言Golang标准库提供了很多类型转换的函数,如strconv包可完成string与基本数据类型之间的转换。比如将int与string之间的互转。//inttostrings:=strconv.Itoa(i)/... 查看详情

golang依赖管理(代码片段)

目录使用GOPATH管理依赖临时GOPATH依赖查找路径使用GOVENDER管理依赖使用GO111MODULE管理依赖Usage常用命令列表不常用命令使用示例开启GO111MODULE使用过程升级依赖项Go国内加速镜像使用方法使用GOPATH管理依赖go1.6前,GOPATH作为第三方的... 查看详情

golang开发:环境篇go运行监控supervisord的使用(代码片段)

为什么要使用Supervisord17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了。到了在测试环境部署的时候,由于不知道有Supervisord这个软件,着实花了些功夫。总不能跟开发环境一样,直接执行编译生成... 查看详情