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.Op&fsnotify.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

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

(0)

相关推荐

  • Golang 并发以及通道的使用方式

    Golang最擅长的就是并发编程,使用Golang可以很方便的进行并发编程.先看一段普通的代码 package main import ( "fmt" "time" ) func Foo(i int) { fmt.Printf("%d will sleep\n", i) time.Sleep(5 * time.Second) fmt.Printf("%d wake up\n", i) } func main() { for i

  • golang 如何替换掉字符串里面的换行符\n

    原始字符串: -----BEGIN LICENSE KEY-----\nL/+HAwEBB2xpY2Vuc2UB/4gAAQIBB1BheWxvYWQBCgABCVNpZ25hdHVyZQEKAAAA\n/gPo/4gB/gHd/7AQABpsaWNlbnNlLW1nci9jb25maWcuUGF5bG9hZP+BAwEBB1Bh\neWxvYWQB/4IAAQoBBUFwcElkAQwAAQZBcHBLZXkBDAABCVN0YXJ0VGltZQEMAAEE\nRGF5cwEEAAEGQWVz

  • golang 中strings包的Replace的使用说明

    函数声明为: func Replace(s, old, new string, n int) string 官方描述为: 返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串. 示例代码为,每行的结果见每行上面的注释部分: func main() { // non-overlapping: "123" repeat 6 times in s s := "123lafaldsjglad123lkfasdf123djfal123lkdjg

  • Golang Printf,Sprintf,Fprintf 格式化详解

    1.`Sprintf` 则格式化并返回一个字 符串而不带任何输出. s := fmt.Sprintf("是字符串 %s ","string") 2. fmt.Println(s) // 是字符串 %s 对应 是字符串 string 3.可以使用 `Fprintf` 来格式化并输出 fmt.Fprintf(os.Stderr, "格式化 %s\n", "error") 顺带说一下格式化的符号: /* %v 输出结构体 {10 3

  • 完美解决go Fscanf 在读取文件时出现的问题

    先要明白Fscanf的工作原理 Fscanf在遇到\n才结束 遇到\r时就会把\r替换成0 这就有个问题,要注意自己的文本换行符是什么,在Windows下就是\r\n,在Linux,Mac下就是\n,也就是说这里有个坑, 代码在Linux和Mac下读取数据文件是正常的,在Windows下就会遇到各种行末尾有个0,网上办法用什么替换啊,用什么自定义Scan函数啊,太麻烦了,直接使用自带IDE将打开的数据文件集换行符改成LF(Linux,Mac换行符)就行了 如下图Idea 文件右下角LF点击就可以

  • golang 中signal包的Notify用法说明

    函数声明为: func Notify(c chan<- os.Signal, sig ...os.Signal) 官方描述: Notify函数让signal包将输入信号转发到c.如果没有列出要传递的信号,会将所有输入信号传递到c:否则只传递列出的输入信号. signal包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,signal包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率.对使用单一信号用于通知的通道,缓存为1就足够了. 示例代码: ch := make(cha

  • golang strings包的Replace的使用说明

    函数声明: func Trim(s string, cutset string) string 官方描述: 返回将 s 前后端所有 cutset 包含的 utf-8 码值都去掉的字符串. 示例代码: package main import ( "fmt" "strings" _ "test/subpac" ) func main(){ fmt.Println("[ !!! Achtung! Achtung! !!! ]:[]:[&quo

  • 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 {

  • Python持续监听文件变化代码实例

    在日常的工作中,有时候会有这样的需求,需要一个常驻任务,持续的监听一个目录下文件的变化,对此作出回应. pyinotify就是这样的一个python包,使用方式如下: 一旦src.txt有新的内容,程序就可以监控到,然后将内容发送 import socket import pyinotify pos = 0 def send(c): c_list = [c] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127

  • Java实现监听文件变化的三种方案详解

    目录 背景 方案一:定时任务 + File#lastModified 方案二:WatchService 方案三:Apache Commons-IO 小结 背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监听等都会遇到类似的场景. 本文给大家提供三种解决方案,并分析其中的利弊,建议收藏,以备不时之需. 方案一:定时任务 + File#lastModi

  • Java利用WatchService监听文件变化示例

    在实现配置中心的多种方案中,有基于JDK7+的WatchService方法,其在单机应用中还是挺有实践的意义的. 代码如下: package com.longge.mytest; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKind

  • JS实现移动端实时监听输入框变化的实例代码

    如果是在pc端,监听输入框你可能想到focus.blur.hover.onkeyup这些事件,但是如果是在移动端使用使用这些事件用户体验极差,因为你要用户收起键盘并且再点个空白处才生效,甚至还存在很大的兼容差异.那么怎么解决呢? 方案一 以前做一个简单的模糊搜索框的需求,大致思路是定义一个1s左右执行的定时器,定时器函数里面的逻辑是 判断文本框内容的长度,如果跟上一次长度有变化,就走一遍查询,如果没有变化不执行任何操作. 方案二 利用jquery提供的 input propertychange

  • node.js监听文件变化的实现方法

    前言 随着前端技术的飞速发展,前端开发也从原始的刀耕火种,向着工程化效率化的方向发展.在各种开发框架之外,打包编译等技术也是层出不穷,开发体验也是越来越好.例如HMR,让我们的更新可以即时可见,告别了手动F5的情况.其实现就是监听文件变化自动调用构建过程.下面就关注下如何实现node监听文件变化. 场景 假定要监听index.js,每当内容更改重新编译. 我们就用简单的console来标识执行编译.下面就是实现该功能. node原生API fs.watchFile 翻下node的文档就会看到一个

  • elementUi vue el-radio 监听选中变化的实例代码

    elementUi vue el-radio 监听选中变化的实例代码如下所述: //change是radio-group标签的事件 <div> <el-radio-group v-model="radioSex" @change="changeHandler"> <el-radio class="radio" label="man">男</el-radio> <el-rad

  • Android 动态注册监听网络变化实例详解

    Android 动态注册监听网络变化实例详解 新建一个BroadcastTest项目,然后修改MainActivity中的代码,如下: public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle

  • Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Java只提供了File类来操作文件.文件夹本身,功能有限,性能也不高. NIO.2为解决这种缺陷,提供了Path接口,并提供了Paths.Files2个工具类,这2个工具类包含的方法都是静态方法,Files类提供了大量的静态方法来操作文件.文件夹. Path接口.Paths工具类使用示例: //获

  • Golang监听日志文件并发送到kafka中

    目录 前言 涉及的golang库和可视化工具: 工作的流程 环境准备 代码分层 关键的代码 main.go kafka.go tail.go 前言 日志收集项目的准备中,本文主要讲的是利用golang的tail库,监听日志文件的变动,将日志信息发送到kafka中. 涉及的golang库和可视化工具: go-ini,sarama,tail其中: go-ini:用于读取配置文件,统一管理配置项,有利于后其的维护 sarama:是一个go操作kafka的客户端.目前我用于向kefka发送消息 tail

随机推荐