Inotify 是一個 Linux特性,它監控文件系統操作,比如讀取、寫入和創建。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。學習如何將 inotify 集成到您的應用程序中,並發現一組可用來進一步自動化系統治理的命令行工具。
要使用 inotify,必須具備一臺帶有 2.6.13 或更新內核的 Linux 機器(以前的 Linux 內核版本使用更低級的文件監控器dnotify)。
1、檢察服務器內核是否支持inotify
安裝inotify 的第一步是確定你使用的 Linux 內核是否支持它
[root@localhost ~]# uname -r 2.6.32-358.el6.x86_64 [root@localhost ~]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jul 9 15:01 max_queued_events -rw-r--r-- 1 root root 0 Jul 9 15:01 max_user_instances -rw-r--r-- 1 root root 0 Jul 9 15:01 max_user_watches
inotify 的默認內核參數詳解
a./proc/sys/fs/inotify/max_queued_events
默認值: 16384
該文件中的值爲調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值得事件被丟棄,但會觸發IN_Q_OVERFLOW事件
b./proc/sys/fs/inotify/max_user_instances
默認值: 128
指定了每一個real user ID可創建的inotify instatnces的數量上限
c./proc/sys/fs/inotify/max_user_watches
默認值: 8192
指定了每個inotify instance相關聯的watches的上限,也就是每一個inotify實例可監控的最大目錄數。如果監控的文件數目巨大,需要根據實際情況適當增加此值得大小。
注意:
max_queued_events 是 Inotify 管理的隊列的最大長度,文件系統變化越頻繁,這個值就應該越大!如果你在日誌中看到Event Queue Overflow,說明max_queued_events太小需要調整參數後再次使用
2、安裝inotify-tools
[root@localhost ~]# yum install make gcc gcc-c++ [root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz [root@localhost ~]# tar xzf inotify-tools-3.13.tar.gz [root@localhost ~]# cd inotify-tools-3.13 [root@localhost inotify-tools-3.13]# ./configure [root@localhost inotify-tools-3.13]# make && make install
安裝過程很簡單,這樣就安裝完成了!
在編譯安裝 inotify-tools 成功之後,默認情況會在 /usr/local/bin 目錄下生成兩個二進制文件:
[root@localhost inotify-tools-3.13]# ll /usr/local/bin/ total 80 -rwxr-xr-x 1 root root 38582 Jul 9 15:25 inotifywait -rwxr-xr-x 1 root root 40353 Jul 9 15:25 inotifywatch
其中
inotifywait 僅執行阻塞,等待 inotify 事件,你可以使用它來監控任何一組文件和目錄,或監控整個目錄樹(目錄、子目錄、子目錄的子目錄等等),並且可以結合 shell 腳本,更好的使用 inotifywait。
inotifywatch 用來收集關於被監視的文件系統的統計數據,包括每個 inotify 事件發生多少次。
3.inotifywait和inotifywatch用法介紹:
inotifywait
語法:
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
-h,-help # 輸出幫助信息 @ # 排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑 --fromfile # 從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭 -m,-monitor # 接收到一個事情而不退出,無限期地執行。默認行爲是接收到一個事情後立即退出 -d,-daemon # 跟-monitor一樣,除了是在後臺運行,需要指定 -outfile把事情輸出到一個文件。也意味着使用了-syslog -o,-outfile # 輸出事情到一個文件而不是標準輸出。 -s,-syslog # 輸出錯誤信息到系統日誌 -r,-recursive # 監視一個目錄下的所有子目錄。 -q,-quiet # 指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。 -exclude # 正則匹配需要排除的文件,大小寫敏感。 -excludei # 正則匹配需要排除的文件,忽略大小寫。 -t,-timeout# 設置超時時間,如果爲0,則無限期地執行下去。 -e,-event # 指定監視的事件。 -c,-csv # 輸出csv格式。 --timefmt # 指定時間格式,用於-format選項中的%T格式。 --format # 指定輸出格式。 %w 表示發生事件的目錄 %f 表示發生事件的文件 %e 表示發生的事件 %Xe 事件以“X”分隔 %T 使用由-timefmt定義的時間格式
下面是一些可監聽事件,針對-e選項使用:
access 文件讀取 modify 文件更改。 attrib 文件屬性更改,如權限,時間戳等。 close_write 以可寫模式打開的文件被關閉,不代表此文件一定已經寫入數據。 close_nowrite 以只讀模式打開的文件被關閉。 close 文件被關閉,不管它是如何打開的。 open 文件打開。 moved_to 一個文件或目錄移動到監聽的目錄,即使是在同一目錄內移動,此事件也觸發。 moved_from 一個文件或目錄移出監聽的目錄,即使是在同一目錄內移動,此事件也觸發。 move 包括moved_to和 moved_from move_self 文件或目錄被移除,之後不再監聽此文件或目錄。 create 文件或目錄創建 delete 文件或目錄刪除 delete_self 文件或目錄移除,之後不再監聽此文件或目錄 unmount 文件系統取消掛載,之後不再監聽此文件系統。
實例 :
1.實時監控/etc目錄的所有事件(包括文件的訪問,寫入,修改,刪除等)
[root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywait -mr /etc/
2.實時監控/home目錄的文件或目錄創建,修改和刪除相關事件並按指定格式輸出
[root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywait -mrq -e create,modify,delete --timefmt '%Y%m%d %H:%M:%S' --format '%T %e %w%f' /home/
在/home目錄下創建te文件和刪除,就會輸出如上圖
3.寫個腳本,實時監控httpd目錄/var/www/html裏文件的刪除,修改,創建和權限相關事件,並且要求將監控信息寫入/var/log/web_jiankong.log。
/usr/local/bin/inotifywait -mrq --timefmt '%Y/%m/%d %H:%M:%S' --format '%T %e %w%f ' --event delete,modify,create,attrib /var/www/html | while read date event time file do case $event in MODIFY|CREATE|MOVE|MODIFY) echo $date'-'$time'-'$event'-'$file >> /var/log/web_watch.log ;; esac done
inotifywatch
語法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
參數:
-h,–help # 輸出幫助信息
-v,–verbose # 輸出詳細信息
@ # 排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
–fromfile # 從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z,–zero # 輸出表格的行和列,即使元素爲空
–exclude # 正則匹配需要排除的文件,大小寫敏感。
–excludei # 正則匹配需要排除的文件,忽略大小寫。
-r,–recursive # 監視一個目錄下的所有子目錄。
-t,–timeout # 設置超時時間
-e,–event # 只監聽指定的事件。
-a,–ascending # 以指定事件升序排列。
-d,–descending # 以指定事件降序排列
例:統計home目錄文件系統30秒內發生的事件次數
/usr/local/bin/inotifywatch -v -e create -e modify -e delete -t 30 -r /home [root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywatch -v -e create -e modify -e delete -t 30 -r /home Establishing watches... Setting up watch(es) on /home OK, /home is now being watched. Total of 2 watches. Finished establishing watches, now collecting statistics. Will listen for events for 30 seconds. total create delete filename 4 0 3 /home/cxb/ 3 1 2 /home/