運維場景中,有時候需要對某個配置文件,或者某個目錄進行watch監控,當發生變更行為時候能獲取變更信息進行下一步處理。
基于開源項目https://github.com/fsnotify/fsnotify我們可以實現對文件系統監控功能。
fsnotify可以支持跨平臺文件系統watcher實現,在不同平臺基于不同的調度器實現,目前已經實現的調度器有
Adapter | OS | Existing Implementation |
inotify | Linux, Android | 支持 |
kqueue | BSD, macOS, iOS* | 支持 |
ReadDirectoryChangesW | Windows | 支持 |
inotify
fsnotify Op | EVFILT_VNODE | Description |
Delete | IN_DELETE_SELF | 監視文件/目錄本身被刪除 |
Rename | IN_MOVE_SELF | 監視文件/目錄本身被移動 |
IN_ACCESS | 訪問(讀取)文件 | |
Chmod | IN_ATTRIB | 元數據更改了——權限、時間戳、擴展屬性、鏈接計數、UID或GID |
IN_CLOSE_WRITE | 打開待寫的文件已關閉 | |
IN_CLOSE_NOWRITE | 未打開待寫入的文件已關閉 | |
Create | IN_CREATE | 在watcher目錄中創建的文件/目錄 |
IN_MOVED_TO | 當文件重命名時,為包含新文件名的目錄生成 | |
IN_OPEN | 文件打開 | |
Remove | IN_DELETE | 從watch目錄中刪除文件/目錄 |
Write | IN_MODIFY | 文件被修改 |
Rename | IN_MOVED_FROM | 重命名文件時,為包含舊文件名的目錄生成 |
kqueue
fsnotify Op | EVFILT_VNODE | Description |
Remove | NOTE_DELETE | 對描述符所引用的文件調用unlink()系統調用 |
Write | NOTE_WRITE | 描述符引用的文件發生了寫操作 |
NOTE_EXTEND | 描述符引用的文件被擴展。(大小增加) | |
Chmod | NOTE_ATTRIB | 描述符引用的文件的屬性發生了變化. |
NOTE_LINK | 文件上的鏈接數改變了 | |
Rename | NOTE_RENAME | 描述符引用的文件被重命名 |
NOTE_REVOKE | 對文件的訪問被撤銷,或者底層文件系統被卸載 | |
Create | N/A | fsnotify使用ioutil,ReadDir來模擬inotify檢測目錄監視創建的文件的能力. |
linux環境要實現對文件系統的watcher還需要確認以下linux內核參數是否配置
# 通過sysctl -a 獲取內核參數, max_user_watches>=8192 ,max_queued_events>=16384
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
#也可以訪問 /proc/sys/fs/inotify 路徑查看
基于fsnotify可以實現的功能
文件修改,刪除,讀取監控
目錄下新增,修改,刪除,讀取監控
結合4A/安全堡壘設備,告警平臺 實現對敏感文件/目錄操作的溯源,告警
附代碼實現對文件監控
代碼實現了對文件進行watcher監控,當對文件繼續增刪改的時候會觸發響應的events,實際環境中對這些觸發的events可將event信息傳遞給kafka這類消息隊列,本段代碼只是一個示例
另外當文件被recreate時候,watcher會丟失文件描述符信息,需要在代碼層實現對文件的重新watcher。
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/fsnotify/fsnotify"
)
func main() {
monitorDir()
}
func monitorDir() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
go func() {
for {
select {
case event := <-watcher.Events:
fmt.Printf("New watch File: %s ", event.Name)
switch event.Op {
case fsnotify.Create:
log.Printf("Create File:%s ", event.Name)
case fsnotify.Write:
log.Printf("Write File:%s ", event.Name)
case fsnotify.Remove, fsnotify.Rename:
log.Printf("Remove or Delete File:%s ", event.Name)
//重新添加watch
log.Printf("Add Watch File:%s ", event.Name)
// 文件被remove后會丟失描述符,需要重新watcher才能重新獲取
err = watcher.Add(event.Name)
if err != nil {
log.Fatal(err)
}
case fsnotify.Chmod:
log.Printf("Chmod File:%s ", event.Name)
}
case err := <-watcher.Errors:
log.Println(err)
}
}
}()
// log.Printf("Add New Watch File:%s")
// 對/etc/shadow /etc/passwd 文件進行watcher
fileArray := [2]string{"/etc/shadow", "/etc/passwd"}
for _, f := range fileArray {
fmt.Printf("Add Watch FIle:%s ", f)
watcher.Add(f)
}
// waiting
select {}
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129968.html
摘要:目前,高德主要有地圖導航兩個產品,以及地圖,同時還開放了服務,方便移動開發者更好地為用戶提供高質量基于位置的服務。另外,高德經常有大型活動,用戶訪問量會在某個階段激增,這時就需基于阿里云的彈性伸縮服務,就能實現快速擴展的基礎設施。 摘要: 云計算帶來的變革不言而喻,作為一種新型的IT交付模式,切實為企業節省IT成本、加快IT與企業業務結合效率、提升創新能力、加強管理水平以及增強系統本身...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20