在golang中,可以利用fsnotify來實(shí)現(xiàn)文件監(jiān)控。fsnotify是go語言跨平臺(tái)文件系統(tǒng)監(jiān)控工具,實(shí)現(xiàn)了一個(gè)基于channel的、跨平臺(tái)的實(shí)時(shí)監(jiān)聽接口;golang通過fsnotify可監(jiān)控文件,并通過文件變化重啟程序。
本教程操作環(huán)境:windows10系統(tǒng)、GO 1.18版本、Dell G3電腦。
在golang中,可以利用fsnotify來實(shí)現(xiàn)文件監(jiān)控。
golang 通過fsnotify監(jiān)控文件,并通過文件變化重啟程序。
go語言跨平臺(tái)文件系統(tǒng)監(jiān)控工具 — fsnotify
在 linux 內(nèi)核中,Inotify 是一種用于通知用戶空間程序文件系統(tǒng)變化的機(jī)制。它監(jiān)控文件系統(tǒng)的變化,如文件新建、修改、刪除等,并可以將相應(yīng)的事件通知給應(yīng)用程序。
Inotify 既可以監(jiān)控文件,也可以監(jiān)控目錄。當(dāng)監(jiān)控目錄時(shí),它可以同時(shí)監(jiān)控目錄及目錄中的各子目錄及文件。Golang 的標(biāo)準(zhǔn)庫 syscall 實(shí)現(xiàn)了該機(jī)制。
為了進(jìn)一步擴(kuò)展和抽象, github.com/fsnotify/fsnotify 包實(shí)現(xiàn)了一個(gè)基于 channel 的、跨平臺(tái)的實(shí)時(shí)監(jiān)聽接口。
fsnotify工具的使用
一、下載我們需要的包
go get github.com/fsnotify/fsnotify
二、使用fsnotify監(jiān)控文件
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 |
|
測試結(jié)果如下:
我們在tmp目錄下的操作都被捕捉到了,但是fsnotify有一個(gè)問題,它無法遞歸的幫我們捕捉子目錄、孫子目錄的操作事件,這需要我們自已來實(shí)現(xiàn)。
還有一個(gè)問題就是當(dāng)們修改文件夾名稱時(shí),fsnotify中event.Name仍然是原來的文件名,這就需要我們在重命名事件中,先移除之前的監(jiān)控,然后添加新的監(jiān)控。
修改如下:
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 |
|
測試結(jié)果如下:
經(jīng)過上面的例子,我們通過fsnotify來寫一個(gè)監(jiān)控配置文件,如果配置文件有修改,就重新啟動(dòng)服務(wù)。
我們先寫一個(gè)可以運(yùn)行的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 |
|
使用如下命令,編譯成exe文件
1 |
|
監(jiān)控文件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 |
|
我們運(yùn)行fsnotify3.go文件來監(jiān)控我們的配置文件
通過上面的圖可以看到,當(dāng)我們修改配置文件中的端口號時(shí),會(huì)先kill掉進(jìn)程,然后再啟動(dòng)一個(gè)進(jìn)程。
推薦學(xué)習(xí):Golang教程