• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang监听文件变化的实例

    废话不多说,直接上官网demo

    package main
    import (
    	"log"
    	"github.com/fsnotify/fsnotify"
    )
    func main() {
    	watcher, err := fsnotify.NewWatcher()
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer watcher.Close()
    	done := make(chan bool)
    	go func() {
    		for {
    			select {
    			case event, ok := -watcher.Events:
    				if !ok {
    					return
    				}
    				log.Println("event:", event)
    				if event.Opfsnotify.Write == fsnotify.Write {
    					log.Println("modified file:", event.Name)
    				}
    			case err, ok := -watcher.Errors:
    				if !ok {
    					return
    				}
    				log.Println("error:", err)
    			}
    		}
    	}()
    	err = watcher.Add("/tmp/foo")
    	if err != nil {
    		log.Fatal(err)
    	}
    	-done
    }
    

    补充:golang监控文件变化,git自动提交代码

    代码如下:

    如果文件有变动,且10分钟内,没有再次变动,则提交代码

    package main 
    import (
     "fmt"
     _ "fmt"
     "github.com/fsnotify/fsnotify"
     "log"
     "os"
     "os/exec"
     "path/filepath"
     "time"
    )
     
    //if the conditions are met, execute the shell script
    func execCmd() {
     cmd := exec.Command("/root/nfs_bak_pro/nfs.git.sh")
     err := cmd.Run()
     if err != nil {
     fmt.Println("Execute Command failed:" + err.Error())
     return
     }
     fmt.Println("Execute Command finished.")
    }
     
    //handle folder files changed event
    func watchFiles(watcher *fsnotify.Watcher, ch chan int64) {
     for {
     select {
     case ev := -watcher.Events: {
     isNotify := false
     
     if ev.Op  fsnotify.Create == fsnotify.Create {
      log.Println("create : ", ev.Name)
      isNotify = true
     
      file, err := os.Stat(ev.Name)
      if err == nil  file.IsDir() {
      watcher.Add(ev.Name)
      fmt.Println("add watch : ", ev.Name)
      }
     }
     
     if ev.Op  fsnotify.Remove == fsnotify.Remove {
      log.Println("delete : ", ev.Name)
      isNotify = true
      err := watcher.Remove(ev.Name)
      fmt.Printf("remove watch: %s, err: %v\n", ev.Name, err)
     }
     
     if ev.Op  fsnotify.Rename == fsnotify.Rename {
      log.Println("rename : ", ev.Name)
      if "" != ev.Name {
      isNotify = true
      err := watcher.Remove(ev.Name)
      fmt.Printf("remove watch: %s, err: %v\n", ev.Name, err)
      }
     }
     
     if isNotify {
      ch - time.Now().Unix()
     }
     }
     case err := -watcher.Errors: {
     log.Println("watcher error : ", err)
     return
     }
     }
     }
    }
     
    //if folder event met, execute the shell script after 10minutes
    func watchTime(ch chan int64) {
     var timer *time.Timer
     for {
     select {
     case - ch:{
     if nil != timer {
      log.Printf("reset timer")
      timer.Stop()
     }
     timer = time.NewTimer(10 * 60 * time.Second)
     go func() {
      -timer.C
      execCmd()
     }()
     }
     }
     }
    }
     
    //watch the folder and sub folders
    func WatchDir(watcher *fsnotify.Watcher, dir string) {
     filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
     if info.IsDir() {
     path, err := filepath.Abs(path)
     if err != nil {
     return err
     }
     err = watcher.Add(path)
     if err != nil {
     return err
     }
     }
     return nil
     })
    } 
     
    func main() {
     notifyCh := make(chan int64)
     watcher, err := fsnotify.NewWatcher()
     if err != nil {
     log.Fatal(err)
     }
     defer watcher.Close()
     
     WatchDir(watcher, "/data/nfs")
     go watchFiles(watcher, notifyCh)
     go watchTime(notifyCh)
     select {}
    }

    shell 脚本如下

    #!/bin/bash
     
    cd /root/nfs_bak_pro/nfs.git
    log_file=/root/nfs_bak_pro/nfs_git_`date +"%Y%m%d"`.log
     
    git add --all . >> $log_file
    git commit -a -m "`date +"%Y-%m-%d %H:%M:%S"`" >> $log_file
    git push origin master >> $log_file

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • golang使用信号量热更新的实现示例
    • Golang信号处理及如何实现进程的优雅退出详解
    • golang模拟实现带超时的信号量示例代码
    • golang 监听服务的信号,实现平滑启动,linux信号说明详解
    上一篇:golang 中signal包的Notify用法说明
    下一篇:解决Golang小数float64在实际工程中加减乘除的精度问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang监听文件变化的实例 golang,监听,文件,变化,的,