linux inotify 監控檔案系統事件(incron,基於事件驅動的cron- )
原文地址:
http://www.51know.info/system_security/inotify.html
1. Inotify 機制概述
1.1. Inotify 介紹
在日常的運維過程中,經常需要備份某些檔案,或者對系統的某些檔案進行監控,比如重要的配置檔案等。如果需要作到實時同步或者監控,就需要使用核心的inotify機制
Inotify 是基於inode級別的檔案系統監控技術,是一種強大的、細粒度的、非同步的機制,它滿足各種各樣的檔案監控需要,不僅限於安全和效能
- Inotify 不需要對被監視的目標開啟檔案描述符,而且如果被監視目標在可移動介質上,那麼在 umount 該介質上的檔案系統後,被監視目標對應的 watch 將被自動刪除,並且會產生一個 umount 事件。
- Inotify 既可以監視檔案,也可以監視目錄。
- Inotify 使用系統呼叫而非 SIGIO 來通知檔案系統事件。
- Inotify 使用檔案描述符作為介面,因而可以使用通常的檔案 I/O 操作select 和 poll 來監視檔案系統的變化。
1.2. Inotify 可監視的檔案系統事件
- IN_ACCESS : 即檔案被訪問
- IN_MODIFY : 檔案被 write
- IN_ATTRIB : 檔案屬性被修改,如 chmod、chown、touch 等
- IN_CLOSE_WRITE : 可寫檔案被 close
- IN_CLOSE_NOWRITE : 不可寫檔案被 close
- IN_OPEN : 檔案被open
- IN_MOVED_FROM : 檔案被移走,如 mv
- IN_MOVED_TO : 檔案被移來,如 mv、cp
- IN_CREATE : 建立新檔案
- IN_DELETE : 檔案被刪除,如 rm
- IN_DELETE_SELF : 自刪除,即一個可執行檔案在執行時刪除自己
- IN_MOVE_SELF : 自移動,即一個可執行檔案在執行時移動自己
- IN_UNMOUNT : 宿主檔案系統被 umount
- IN_CLOSE : 檔案被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
- IN_MOVE : 檔案被移動,等同於(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所說的檔案也包括目錄
1.3. Inotify核心版本支援
- 從kernel 2.6.13開始,Inotify正式併入核心,RHEL5已經支援.
- 看看是否有 /proc/sys/fs/inotify/目錄,以確定核心是否支援inotify
[[email protected] Rsync]# ls -l /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Oct 9 09:36 max_queued_events -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_instances -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_watches
1.4. inotify 的預設核心引數
- /proc/sys/fs/inotify/max_queued_events 預設值: 16384 該檔案中的值為呼叫inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值得事件被丟棄,但會觸發IN_Q_OVERFLOW事件
- /proc/sys/fs/inotify/max_user_instances 預設值: 128 指定了每一個real user ID可建立的inotify instatnces的數量上限
- /proc/sys/fs/inotify/max_user_watches 預設值: 8192 指定了每個inotify instance相關聯的watches的上限
注意: max_queued_events 是 Inotify 管理的佇列的最大長度,檔案系統變化越頻繁,這個值就應該越大
如果你在日誌中看到Event Queue Overflow,說明max_queued_events太小需要調整引數後再次使用.
2. Inotify 在系統中使用
2.1. linux shell 下使用inotify
- 下載安裝 inotify-tools原始碼 rhel5/centos5
RPM包
- inotifywait 僅執行阻塞,等待 inotify 事件。您可以監控任何一組檔案和目錄,或監控整個目錄樹(目錄、子目錄、子目錄的子目錄等等)
在 shell 指令碼中使用 inotifywait。 - inotifywatch 收集關於被監視的檔案系統的統計資料,包括每個 inotify 事件發生多少次。
- inotifywait 僅執行阻塞,等待 inotify 事件。您可以監控任何一組檔案和目錄,或監控整個目錄樹(目錄、子目錄、子目錄的子目錄等等)
- shell指令碼示例
[[email protected] ]# cat /tmp/test.sh #!/bin/bash inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' --event modify,delete,create,attrib /home/admin | while read date time file event do case $event in MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR) echo $event'-'$file ;; MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR) echo $event'-'$file ;; esac done
- 執行指令碼,結果輸出(這裡測試刪除了一個目錄 rm -fr cronolog-1.6.2.bak)
[[email protected]]# /tmp/test.sh DELETE-/home/admin/cronolog-1.6.2.bak/COPYING DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.info DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.texi DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/doc/texinfo.tex DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronosplit.1m DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.1m DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/doc DELETE-/home/admin/cronolog-1.6.2.bak/TODO DELETE-/home/admin/cronolog-1.6.2.bak/src/cronotest.c DELETE-/home/admin/cronolog-1.6.2.bak/src/cronolog.c DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.h DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.c DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit.in DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit DELETE-/home/admin/cronolog-1.6.2.bak/src/config.h DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/src DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt1.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.h DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/lib/localtime_r.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/lib/strptime.c DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/lib DELETE-/home/admin/cronolog-1.6.2.bak/config.cache DELETE-/home/admin/cronolog-1.6.2.bak/install-sh DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/README DELETE-/home/admin/cronolog-1.6.2.bak/AUTHORS DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/README DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/testsuite DELETE-/home/admin/cronolog-1.6.2.bak/cronolog.spec DELETE-/home/admin/cronolog-1.6.2.bak/NEWS DELETE-/home/admin/cronolog-1.6.2.bak/configure DELETE-/home/admin/cronolog-1.6.2.bak/ChangeLog DELETE-/home/admin/cronolog-1.6.2.bak/missing DELETE-/home/admin/cronolog-1.6.2.bak/config.log DELETE-/home/admin/cronolog-1.6.2.bak/aclocal.m4 DELETE-/home/admin/cronolog-1.6.2.bak/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/INSTALL DELETE-/home/admin/cronolog-1.6.2.bak/config.status DELETE-/home/admin/cronolog-1.6.2.bak/configure.in DELETE-/home/admin/cronolog-1.6.2.bak/mkinstalldirs DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak
詳細請參考 man inotify , man inotifywait
2.2. 使用incron實現重要配置檔案監控
Incron是inotify的cron系統,與os本身的cron一樣,包含一個後臺守護程序(incrond)和一個事件編輯器(incrontab
與os本身的cron不同的僅僅是觸發時間的是os對某個檔案(夾)的操作而不是時間,由系統事件觸發的機制,對於應用系統來說,幾乎可以做到實時性。
- 安裝Incron Incron Rpm包
[[email protected]]# yum install Incron
- 檢視 incron 支援的事件型別 incrontab -t ,編輯配置檔案使用 incrontab -e
- 配置檔案格式說明(預設配置在/var/spool/incron/ 目錄下)
<path> <mask> <command>
選項說明:
<path>:欲監控的檔案或者目錄
<mask>:os對監控物件發生的事件
<command>:command可以是系統命令,也可以是指令碼,不能是用系統的重定向,除非重定向寫在指令碼中。 <Command>中還可以使用下面的這些變數:
[email protected]:代表<path>,即監控物件
$#:發生系統事件的物件(例如監控了某個資料夾,其下的某個檔案發生了變化,那麼$#就代表了該檔名)
$%:代表<mask>,即發生的事件
- 配置舉例:
- /home/admin/a.txt IN_MODIFY echo "[email protected] $#" 表示檔案abc一旦被修改,就執行 echo "[email protected] $#"
- /home/admin/ IN_ALL_EVENTS echo "[email protected] $# $%" 表示目錄下的檔案任何事件觸發,就執行 echo "[email protected] $#"
- 啟動incrond (/etc/init.d/incrond start),然後在 /home/admin目錄刪除 ssss 檔案,檢視日誌 tail /var/log/cron ,有如下輸出
Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_OPEN,IN_ISDIR") Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_CLOSE_NOWRITE,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_OPEN,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_CLOSE_NOWRITE,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = ssss = IN_DELETE")
總體來說,在檔案和目錄實時監控還是很有效的,可以結合其他工具來作統一化的解決方案,比如使用syslog-ng作統一化收集,當然最重要還是要有場景.
相關推薦
linux inotify 監控檔案系統事件(incron,基於事件驅動的cron- )
原文地址: http://www.51know.info/system_security/inotify.html 1. Inotify 機制概述 1.1. Inotify 介紹 在日常的運維過程中,經常需要備份某些檔案,或者對系統的某些檔案進行監控,比如重要的
LINUX移植——根檔案系統製作(一)
上一篇文章當中,說了說怎樣搭建nfs伺服器的過程,這也是製作根檔案系統前必須的準備工作,當然也可以用其他方法,但從除錯的角度來說,還是nfs最適合了。這篇文章咱們正式開始製作根檔案系統,主要內容如下:
Linux-1.4檔案操作命令(grep,cat,tail,head,less,find,chmod,tail,less)
Linux基礎命令(grep,cat,tail,head,less,find,chmod,tail,less) grep(常用) grep 指定“檔案”搜尋檔案內容 grep hello 1.txt 在檔案中查詢字串 grep -n hello 1.txt 顯示字
linux中搜尋檔案或目錄(which,whereis,locate,find)
[[email protected] ~]# locate passwd /home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passw
linux常用命令-檔案編輯類(cat,vim,more)
cat 描述: 將資料顯示到基本輸出中 引數: -n:顯示行號(包括空行) -b:顯示行號(不包括空行) -s:將兩個及以上空行合併為一個空行 樣例: cat -sb a.txt b.t
jsp-系統登入(老規矩,會一直修改的)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>
linux磁碟與檔案系統管理的那些事兒(2)
我們接著第一篇文章講起。 檔案系統掛載與解除安裝 建立完檔案系統,我們需要將新建的檔案系統掛載到根檔案系統上的某個目錄上,進而我們便可以通過該目錄來訪問該檔案系統。建立這種關聯關係的過程稱為掛載,所掛載的目錄稱為掛載點;若解除這種關聯關係,則稱之為解除安裝; 由
python watchdog:監控檔案系統事件的Python庫
watchdog.events.FileSystemEventHandler() 事件處理器的基類,用於處理事件,使用者需繼承該類,並在子類中重寫對應方法。 類例項方法如下: self.dispatch(event) 接收到一個事件後,通過該方法來決定該event由下面哪個方法
Linux核心移植和根檔案系統製作(詳細步驟精講)
start_kernel是所有 Linux 平臺進入系統核心初始化後的入口函式,它主要完成剩餘的與硬體平臺相關的初始化工作,在進行一系列與核心相關的初始化後,呼叫第一個使用者程序-init 程序並等待使用者程序的執行,這樣整個 Linux 核心便啟動完畢。該函式所做的具體工作有:呼叫 setup_arch
Ubuntu: inotify遞迴監控檔案系統狀態
參考: inotify只能監控單層目錄變化,不能監控子目錄中的變化情況。所以只能遍歷目錄,將所有子目錄新增入監控列表 當所監控目錄超過8192時,導致too many open files, 兩種解決方案: 1: 需要更改下列檔案數值大小: /p
Linux 檔案系統呼叫(習題)
1 設計一個程式,要求開啟檔案"pass",如何沒有這個檔案,新建此檔案,許可權設定為只有所有者有隻讀許可權。 程式程式碼: #include <stdio.h> #include <stdlib.h> #include <fcntl.h>
Linux檔案系統學習(四)之read open系統呼叫
open的執行過程:v2.6.30 Open Sys_open |do_sys_open() |get_unused_fd_flags ()//得到一個可用的檔案描述符;通過該函式,可知檔案描述符
Linux 磁碟與檔案系統 —— 基礎知識(一)
一,磁碟的物理組成 1、扇區(Sector)是最小的物理儲存單位,有 512bytes 和 4K 兩種格式。 2、將扇區組成一個圓,就是磁柱。 3、最小分割槽單位通常為扇區。 4、硬碟分割槽表主要有兩種格式,一種是限制較多的 MBR 分割槽,一種
linux 獲取檔案系統資訊(磁碟資訊)
原始碼如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/vfs.h> //檔案系統資訊結構體 stru
【Linux 核心】檔案系統(結構篇)
ok,繼前面概念篇之後,我們開始正式的探討下Linux的檔案系統。 檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制(教材式還是需要的),在前面的概念篇有說到,Linux支援大多數檔案系統,可以預料到Linux檔案系統介面實現為分層的體系結構,從而將使用
linux基礎3-磁碟和檔案系統相關 LINUX支援哪些檔案系統 linux下磁碟分割槽詳解 圖文(fdisk;mkfs)
一 dumpe2fs : 在Linux使用過程中,我們如果要了解檔案系統的配置情況,可以使用dumpe2fs檢視ext2/ext3/ext4格式的檔案系統資訊。 命令格式: dumpe2fs [選項] 裝置 常用選項: -h 僅列出超級塊中的資訊
ZYNQ之uboot,kernel,裝置樹,檔案系統生成(轉載)
轉載自:https://www.cnblogs.com/huakaimanlin/p/9055800.html Vivado:2016.4 Linux:Ubuntu16.4 ZYNQ:xc7z020 下載檔名稱 2016.4-zed-release.tar.x
3、簡述Linux支援哪些檔案系統及其特點
答:ext2和ext3. ext2的特性:1、當建立ext2檔案系統時,系統管理員可以根據預期的檔案平均長度來選擇最佳塊的大小(從1024到4069位元組) 2:當建
Linux檢視分割槽檔案系統型別總結
在Linux 中如何檢視分割槽的檔案系統型別,下面總結幾種檢視分割槽檔案系統型別的方法。 1、df -T 命令檢視 這個是最簡單的命令,檔案系統型別在Type列輸出。只可以檢視已經掛載的分割槽和檔案系統型別。如下所示: 2、parted -l命令檢視 如下所示,parted -l 命令
linux裡tmpfs檔案系統
linux裡tmpfs檔案系統 是一個虛擬記憶體檔案系統,它不同於傳統的用塊裝置形式來實現的Ramdisk,也不同於針對實體記憶體的Ramfs。Tmpfs可以使用實體記憶體,也可以使用交換分割槽。 umount /data mount -t tmpfs -o size=32G,mode=0755