gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

golang怎么實現文件監控

在golang中,可以利用fsnotify來實現文件監控。fsnotify是go語言跨平臺文件系統監控工具,實現了一個基于channel的、跨平臺的實時監聽接口;golang通過fsnotify可監控文件,并通過文件變化重啟程序。

golang怎么實現文件監控

本教程操作環境:windows10系統、GO 1.18版本、Dell G3電腦。

在golang中,可以利用fsnotify來實現文件監控。

golang 通過fsnotify監控文件,并通過文件變化重啟程序。

go語言跨平臺文件系統監控工具 — fsnotify

在 linux 內核中,Inotify 是一種用于通知用戶空間程序文件系統變化的機制。它監控文件系統的變化,如文件新建、修改、刪除等,并可以將相應的事件通知給應用程序。

Inotify 既可以監控文件,也可以監控目錄。當監控目錄時,它可以同時監控目錄及目錄中的各子目錄及文件。Golang 的標準庫 syscall 實現了該機制。

為了進一步擴展和抽象, github.com/fsnotify/fsnotify 包實現了一個基于 channel 的、跨平臺的實時監聽接口。

fsnotify工具的使用

一、下載我們需要的包

go get github.com/fsnotify/fsnotify
登錄后復制

二、使用fsnotify監控文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package main;

import (

"github.com/fsnotify/fsnotify"

"log"

"fmt"

)

func main() {

//創建一個監控對象

watch, err := fsnotify.NewWatcher();

if err != nil {

log.Fatal(err);

}

defer watch.Close();

//添加要監控的對象,文件或文件夾

err = watch.Add("./tmp");

if err != nil {

log.Fatal(err);

}

//我們另啟一個goroutine來處理監控對象的事件

go func() {

for {

select {

case ev := <-watch.Events:

{

//判斷事件發生的類型,如下5種

// Create 創建

// Write 寫入

// Remove 刪除

// Rename 重命名

// Chmod 修改權限

if ev.Op&fsnotify.Create == fsnotify.Create {

log.Println("創建文件 : ", ev.Name);

}

if ev.Op&fsnotify.Write == fsnotify.Write {

log.Println("寫入文件 : ", ev.Name);

}

if ev.Op&fsnotify.Remove == fsnotify.Remove {

log.Println("刪除文件 : ", ev.Name);

}

if ev.Op&fsnotify.Rename == fsnotify.Rename {

log.Println("重命名文件 : ", ev.Name);

}

if ev.Op&fsnotify.Chmod == fsnotify.Chmod {

log.Println("修改權限 : ", ev.Name);

}

}

case err := <-watch.Errors:

{

log.Println("error : ", err);

return;

}

}

}

}();

//循環

select {};

}

測試結果如下:

golang怎么實現文件監控

我們在tmp目錄下的操作都被捕捉到了,但是fsnotify有一個問題,它無法遞歸的幫我們捕捉子目錄、孫子目錄的操作事件,這需要我們自已來實現。

還有一個問題就是當們修改文件夾名稱時,fsnotify中event.Name仍然是原來的文件名,這就需要我們在重命名事件中,先移除之前的監控,然后添加新的監控。

修改如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

package main;

import (

"github.com/fsnotify/fsnotify"

"fmt"

"path/filepath"

"os"

)

type Watch struct {

watch *fsnotify.Watcher;

}

//監控目錄

func (w *Watch) watchDir(dir string) {

//通過Walk來遍歷目錄下的所有子目錄

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 = w.watch.Add(path);

if err != nil {

return err;

}

fmt.Println("監控 : ", path);

}

return nil;

});

go func() {

for {

select {

case ev := <-w.watch.Events:

{

if ev.Op&fsnotify.Create == fsnotify.Create {

fmt.Println("創建文件 : ", ev.Name);

//這里獲取新創建文件的信息,如果是目錄,則加入監控中

fi, err := os.Stat(ev.Name);

if err == nil && fi.IsDir() {

w.watch.Add(ev.Name);

fmt.Println("添加監控 : ", ev.Name);

}

}

if ev.Op&fsnotify.Write == fsnotify.Write {

fmt.Println("寫入文件 : ", ev.Name);

}

if ev.Op&fsnotify.Remove == fsnotify.Remove {

fmt.Println("刪除文件 : ", ev.Name);

//如果刪除文件是目錄,則移除監控

fi, err := os.Stat(ev.Name);

if err == nil && fi.IsDir() {

w.watch.Remove(ev.Name);

fmt.Println("刪除監控 : ", ev.Name);

}

}

if ev.Op&fsnotify.Rename == fsnotify.Rename {

fmt.Println("重命名文件 : ", ev.Name);

//如果重命名文件是目錄,則移除監控

//注意這里無法使用os.Stat來判斷是否是目錄了

//因為重命名后,go已經無法找到原文件來獲取信息了

//所以這里就簡單粗爆的直接remove好了

w.watch.Remove(ev.Name);

}

if ev.Op&fsnotify.Chmod == fsnotify.Chmod {

fmt.Println("修改權限 : ", ev.Name);

}

}

case err := <-w.watch.Errors:

{

fmt.Println("error : ", err);

return;

}

}

}

}();

}

func main() {

watch, _ := fsnotify.NewWatcher()

w := Watch{

watch: watch,

}

w.watchDir("./tmp");

select {};

}

測試結果如下:

golang怎么實現文件監控

經過上面的例子,我們通過fsnotify來寫一個監控配置文件,如果配置文件有修改,就重新啟動服務。

我們先寫一個可以運行的exe程序,server.go代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

package main;

import (

"io/ioutil"

"log"

"encoding/json"

"net"

"fmt"

"os"

"os/signal"

)

const (

confFilePath = "./conf/conf.json";

)

//我們這里只是演示,配置項只設置一個

type Conf struct {

Port int `json:port`;

}

func main() {

//讀取文件內容

data, err := ioutil.ReadFile(confFilePath);

if err != nil {

log.Fatal(err);

}

var c Conf;

//解析配置文件

err = json.Unmarshal(data, &c);

if err != nil {

log.Fatal(err);

}

//根據配置項來監聽端口

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", c.Port));

if err != nil {

log.Fatal(err);

}

log.Println("server start");

go func() {

ch := make(chan os.Signal);

//獲取程序退出信號

signal.Notify(ch, os.Interrupt, os.Kill);

<-ch;

log.Println("server exit");

os.Exit(1);

}();

for {

conn, err := lis.Accept();

if err != nil {

continue;

}

go func(conn net.Conn) {

defer conn.Close();

conn.Write([]byte("hellon"));

}(conn);

}

}

使用如下命令,編譯成exe文件

1

> go build server.go

監控文件fsnotify3.go代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

package main;

import (

"github.com/fsnotify/fsnotify"

"log"

"fmt"

"os/exec"

"regexp"

"strconv"

"bytes"

"errors"

"os"

"path/filepath"

)

const (

confFilePath = "./conf";

)

//獲取進程ID

func getPid(processName string) (int, error) {

//通過wmic process get name,processid | findstr server.exe獲取進程ID

buf := bytes.Buffer{};

cmd := exec.Command("wmic", "process", "get", "name,processid");

cmd.Stdout = &buf;

cmd.Run();

cmd2 := exec.Command("findstr", processName);

cmd2.Stdin = &buf;

data, _ := cmd2.CombinedOutput();

if len(data) == 0 {

return -1, errors.New("not find");

}

info := string(data);

//這里通過正則把進程id提取出來

reg := regexp.MustCompile(`[0-9]+`);

pid := reg.FindString(info);

return strconv.Atoi(pid);

}

//啟動進程

func startProcess(exePath string, args []string) error {

attr := &os.ProcAttr{

//files指定新進程繼承的活動文件對象

//前三個分別為,標準輸入、標準輸出、標準錯誤輸出

Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},

//新進程的環境變量

Env: os.Environ(),

}

p, err := os.StartProcess(exePath, args, attr);

if err != nil {

return err;

}

fmt.Println(exePath, "進程啟動");

p.Wait();

return nil;

}

func main() {

//創建一個監控對象

watch, err := fsnotify.NewWatcher();

if err != nil {

log.Fatal(err);

}

defer watch.Close();

//添加要監控的文件

err = watch.Add(confFilePath);

if err != nil {

log.Fatal(err);

}

//我們另啟一個goroutine來處理監控對象的事件

go func() {

for {

select {

case ev := <-watch.Events:

{

//我們只需關心文件的修改

if ev.Op&fsnotify.Write == fsnotify.Write {

fmt.Println(ev.Name, "文件寫入");

//查找進程

pid, err := getPid("server.exe");

//獲取運行文件的絕對路徑

exePath, _ := filepath.Abs("./server.exe")

if err != nil {

//啟動進程

go startProcess(exePath, []string{});

} else {

//找到進程,并退出

process, err := os.FindProcess(pid);

if err == nil {

//讓進程退出

process.Kill();

fmt.Println(exePath, "進程退出");

}

//啟動進程

go startProcess(exePath, []string{});

}

}

}

case err := <-watch.Errors:

{

fmt.Println("error : ", err);

return;

}

}

}

}();

//循環

select {};

}

我們運行fsnotify3.go文件來監控我們的配置文件

golang怎么實現文件監控

通過上面的圖可以看到,當我們修改配置文件中的端口號時,會先kill掉進程,然后再啟動一個進程。

golang怎么實現文件監控

推薦學習:Golang教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
久久久久久久久久久99| 超碰91在线播放| 国模无码视频一区二区三区| 黄色免费高清视频| 日本免费黄色小视频| 最近中文字幕免费mv| 蜜桃视频成人在线观看| 一级性生活视频| 国产成人永久免费视频| 黄色一级视频片| 九色在线视频观看| 久久久国产欧美| 久久久国产精华液999999| 99国产精品久久久久久| 99视频在线观看视频| 成人高清dvd| 日韩一级特黄毛片| 99精品视频在线看| gai在线观看免费高清| 911福利视频| 欧美日韩中文字幕在线播放| 免费无码毛片一区二三区| 国产成人在线免费看| 在线观看日本一区二区| 欧洲金发美女大战黑人| 男人天堂网视频| 国产不卡的av| 国产日产欧美视频| 九九精品久久久| 国产女主播自拍| 丰满少妇在线观看| 久久最新免费视频| 蜜臀视频一区二区三区| 99亚洲国产精品| 手机看片一级片| 免费av手机在线观看| 一道本在线免费视频| 91大学生片黄在线观看| 五月天激情视频在线观看| 300部国产真实乱| 小明看看成人免费视频| 久久久久久www| 日本丰满少妇黄大片在线观看| av免费观看网| 免费看欧美一级片| 在线观看国产福利| av7777777| 和岳每晚弄的高潮嗷嗷叫视频| 中文字幕第17页| 久久久久狠狠高潮亚洲精品| 日韩激情视频一区二区| 黄色片免费网址| 一道本视频在线观看| 免费av网址在线| 国产在线播放观看| 日韩精品在线中文字幕| 桥本有菜av在线| 51自拍视频在线观看| 一本久道综合色婷婷五月| 女人帮男人橹视频播放| 9色视频在线观看| 大地资源第二页在线观看高清版| 国产福利在线免费| 天天操天天爱天天爽| 男人操女人免费| 成人3d动漫一区二区三区| 青青草av网站| 色免费在线视频| 三上悠亚在线一区| 精产国品一二三区| 色哟哟免费网站| 蜜臀精品一区二区| 国产视频九色蝌蚪| 777米奇影视第四色| 日韩无套无码精品| 女同激情久久av久久| 91蝌蚪视频在线| 成人区一区二区| 亚洲 欧美 日韩 国产综合 在线| 欧美一级视频在线播放| 18禁免费无码无遮挡不卡网站| 日韩黄色短视频| 精品人妻一区二区三区四区在线 | 日本高清免费观看| 成人在线观看毛片| 国产精彩视频一区二区| 日韩视频第二页| av亚洲天堂网| 秋霞无码一区二区| 亚洲精品手机在线观看| 一级做a爱视频| 国产精品秘入口18禁麻豆免会员| 我要看一级黄色大片| 天天干天天色天天爽| 日本精品一区在线观看| 狠狠干狠狠操视频| 无码 制服 丝袜 国产 另类| 天堂社区在线视频| 日韩精品一区二区在线视频 | 国产a级一级片| 特黄特黄一级片| 亚洲色成人一区二区三区小说| 黄色手机在线视频| 男女激情无遮挡| 欧美爱爱视频网站| 国产一级不卡毛片| 久艹在线免费观看| www.偷拍.com| 欧美一级特黄a| 97xxxxx| 国产精品啪啪啪视频| 国产又大又黄又粗又爽| av高清在线免费观看| 亚洲欧美日韩一二三区| 青青青在线播放| 人妻夜夜添夜夜无码av | 黄色一级视频播放| 潘金莲激情呻吟欲求不满视频| 国产av人人夜夜澡人人爽麻豆| 国产一二三区av| wwwwww.色| 免费黄色日本网站| 久久国产亚洲精品无码| 丁香六月激情网| 欧美乱做爰xxxⅹ久久久| www.午夜av| 精品国产鲁一鲁一区二区三区| 国产日韩一区二区在线| 欧美爱爱视频免费看| 国产妇女馒头高清泬20p多| 波多野结衣与黑人| 乱熟女高潮一区二区在线| 欧美一级免费在线观看| 天天干天天色天天爽| 中文字幕一区二区三区四区五区人| 三级在线免费看| 182午夜视频| 不用播放器的免费av| 欧美性受xxxx黒人xyx性爽| 91aaa精品| 99中文字幕在线观看| h无码动漫在线观看| av高清在线免费观看| 可以在线看的av网站| 男人揉女人奶房视频60分| 成熟老妇女视频| 欧美成人乱码一二三四区免费| 天堂av.com| 日韩精品视频在线观看视频 | 亚欧美一区二区三区| 色撸撸在线观看| av 日韩 人妻 黑人 综合 无码| 一级日本黄色片| 国产v片免费观看| 草草草在线视频| 三年中文高清在线观看第6集| 亚洲精品少妇一区二区| 无码人妻丰满熟妇区毛片18| 久久精品视频91| 99精品视频免费版的特色功能| 久久综合亚洲精品| 北条麻妃av高潮尖叫在线观看| 性欧美在线视频| av网站手机在线观看| 亚洲视频在线观看一区二区三区| 三区视频在线观看| 欧美变态另类刺激| 波多野结衣网页| 激情内射人妻1区2区3区 | 欧美 丝袜 自拍 制服 另类| 深夜黄色小视频| 成人免费视频91| 日本三日本三级少妇三级66| 韩国日本在线视频| 黄色a级片免费看| 91 视频免费观看| 99精品免费在线观看| 69sex久久精品国产麻豆| www.久久av.com| 人人干人人视频| 男女视频网站在线观看| 精品无码av无码免费专区| 欧美成人三级在线播放| 男人天堂网视频| 国产免费黄色小视频| 中国一级大黄大黄大色毛片| 91高清国产视频| 国产视频在线视频| 日韩亚洲在线视频| 国产男女在线观看| 精品国产一二三四区| 免费网站永久免费观看| 潘金莲一级淫片aaaaa免费看| 污污网站免费观看| 色播五月综合网| 日韩视频在线观看一区二区三区| 欧美精品成人网| 天堂一区在线观看| 污污的视频免费观看| 超碰在线免费av|