運維場景中,有時候需要對某個配置文件,或者某個目錄進行watch監(jiān)控,當(dāng)發(fā)生變更行為時候能獲取變更信息進行下一步處理。
基于開源項目https://github.com/fsnotify/fsnotify我們可以實現(xiàn)對文件系統(tǒng)監(jiān)控功能。
fsnotify可以支持跨平臺文件系統(tǒng)watcher實現(xiàn),在不同平臺基于不同的調(diào)度器實現(xiàn),目前已經(jīng)實現(xiàn)的調(diào)度器有
Adapter | OS | Existing Implementation |
inotify | Linux, Android | 支持 |
kqueue | BSD, macOS, iOS* | 支持 |
ReadDirectoryChangesW | Windows | 支持 |
inotify
fsnotify Op | EVFILT_VNODE | Description |
Delete | IN_DELETE_SELF | 監(jiān)視文件/目錄本身被刪除 |
Rename | IN_MOVE_SELF | 監(jiān)視文件/目錄本身被移動 |
IN_ACCESS | 訪問(讀取)文件 | |
Chmod | IN_ATTRIB | 元數(shù)據(jù)更改了——權(quán)限、時間戳、擴展屬性、鏈接計數(shù)、UID或GID |
IN_CLOSE_WRITE | 打開待寫的文件已關(guān)閉 | |
IN_CLOSE_NOWRITE | 未打開待寫入的文件已關(guān)閉 | |
Create | IN_CREATE | 在watcher目錄中創(chuàng)建的文件/目錄 |
IN_MOVED_TO | 當(dāng)文件重命名時,為包含新文件名的目錄生成 | |
IN_OPEN | 文件打開 | |
Remove | IN_DELETE | 從watch目錄中刪除文件/目錄 |
Write | IN_MODIFY | 文件被修改 |
Rename | IN_MOVED_FROM | 重命名文件時,為包含舊文件名的目錄生成 |
kqueue
fsnotify Op | EVFILT_VNODE | Description |
Remove | NOTE_DELETE | 對描述符所引用的文件調(diào)用unlink()系統(tǒng)調(diào)用 |
Write | NOTE_WRITE | 描述符引用的文件發(fā)生了寫操作 |
NOTE_EXTEND | 描述符引用的文件被擴展。(大小增加) | |
Chmod | NOTE_ATTRIB | 描述符引用的文件的屬性發(fā)生了變化. |
NOTE_LINK | 文件上的鏈接數(shù)改變了 | |
Rename | NOTE_RENAME | 描述符引用的文件被重命名 |
NOTE_REVOKE | 對文件的訪問被撤銷,或者底層文件系統(tǒng)被卸載 | |
Create | N/A | fsnotify使用ioutil,ReadDir來模擬inotify檢測目錄監(jiān)視創(chuàng)建的文件的能力. |
linux環(huán)境要實現(xiàn)對文件系統(tǒng)的watcher還需要確認以下linux內(nèi)核參數(shù)是否配置
# 通過sysctl -a 獲取內(nèi)核參數(shù), 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可以實現(xiàn)的功能
文件修改,刪除,讀取監(jiān)控
目錄下新增,修改,刪除,讀取監(jiān)控
結(jié)合4A/安全堡壘設(shè)備,告警平臺 實現(xiàn)對敏感文件/目錄操作的溯源,告警
附代碼實現(xiàn)對文件監(jiān)控
代碼實現(xiàn)了對文件進行watcher監(jiān)控,當(dāng)對文件繼續(xù)增刪改的時候會觸發(fā)響應(yīng)的events,實際環(huán)境中對這些觸發(fā)的events可將event信息傳遞給kafka這類消息隊列,本段代碼只是一個示例
另外當(dāng)文件被recreate時候,watcher會丟失文件描述符信息,需要在代碼層實現(xiàn)對文件的重新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 {}
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/129968.html
摘要:目前,高德主要有地圖導(dǎo)航兩個產(chǎn)品,以及地圖,同時還開放了服務(wù),方便移動開發(fā)者更好地為用戶提供高質(zhì)量基于位置的服務(wù)。另外,高德經(jīng)常有大型活動,用戶訪問量會在某個階段激增,這時就需基于阿里云的彈性伸縮服務(wù),就能實現(xiàn)快速擴展的基礎(chǔ)設(shè)施。 摘要: 云計算帶來的變革不言而喻,作為一種新型的IT交付模式,切實為企業(yè)節(jié)省IT成本、加快IT與企業(yè)業(yè)務(wù)結(jié)合效率、提升創(chuàng)新能力、加強管理水平以及增強系統(tǒng)本身...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20