實踐記錄之-系統監控工具Inotify-tool

        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/

wKioL1O9AiPRqwQbAAAQrSyFDAY296.gif

在/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/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章