最近遇到一個需求:
web應用層往中間件發送資訊的時候,經常出現莫名奇妙的異常,為了定位該中間件發送用戶端的bug,需要抓取異常瞬間的系統運作參數: <code>momery dump</code>和<code>tcp dump</code>等.
當發生異常時已經将發送失敗的資訊列印到了日志檔案中。
異常不定期的發生。
針對這個問題,手動的跟蹤肯定不現實。是以,需要通過腳本監控日志檔案的變化,且在變化的瞬間捕獲系統運作參數。
系統參數
<code>inotify-tools</code>提供的兩個指令行工具:
<code>inotifywait</code>:通過<code>inotify API</code>等待被監控檔案上的相應事件并傳回監控結果,預設情況下,正常的結果傳回至标準輸出,診斷類的資訊則傳回至标準錯誤輸出。它可以在監控到對應監控對象上指定的事件後退出,也可以進行持續性的監控。
<code>inotifywatch</code>:通過<code>inotify API</code>收集被監控檔案或目錄的相關事件并輸出統計資訊。
在此次需求中,需要使用<code>inotifywait</code>
inotifywait指令使用簡介:
inotifywait尤其适用于在腳本中等待某事件的發生,并可基于特定的事件執行相應操作。如将其用于腳本中監控某指定目錄中的檔案上的修改、建立、删除、屬性資訊的改變,而後使用rsync指令将某事件對應的檔案同步至其它主機上。其常用選項如下:
-m, --monitor:inotifywait的預設動作是在監控至指定檔案的特定事件發生一次後就退出了,而使用此選項則可實作持續性的監控;
-r, --recursive:遞歸監控指定目錄下的所有檔案,包括建立的檔案或子目錄;如果要監控的目錄中檔案數量巨大,則通常需要修改/proc/sys/fs/inotify/max_users_watchs核心參數,因為其預設值為8192。
-e , --event :指定要監控的特定事件,預設是監控所有的事件;此處包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;
--timefmt :當在--format選項中使用%T時,--timefrt選項則可以用來指定自定義的符合strftime規範的時間格式,此時間格式可用的格式符可以通過strftime的手冊頁擷取;--timefrt後常用的參數是'%d/%m/%y %H:%M';
--format :自定義inotifywait的輸出格式,如--format '%T %w %f';常用的格式符如下:
%w:顯示被監控檔案的檔案名;
%f:如果發生某事件的對象是目錄,則顯示被監控目錄的名字;預設顯示為空串;
%T:使用--timefmt選項中自定義的時間格式;
例如,要監控/tmp/test目錄及其内部所有檔案上發生的create,delete,modify,close_write事件,則使用如下指令:
此指令在監控到某檔案上第一次事件後就會退出,如果想一直監控,則需要為指令添加-m選項。
更詳細的使用介紹: 系統監控工具----Inotify-Tools, 關于原理: 基于inotify機制的實時檔案監控
安裝
檔案一旦變化,列印<code>memory dump</code>和<code>tcp dump</code>
<code>memory dump</code> 需要先擷取 <code>tomcat</code> 的 <code>PID</code>
如果需要循環監聽檔案變化, 可以給<code>inotifywait</code>添加<code>-m</code>參數, 并通過管道添加<code>while</code>循環
儲存成shell腳本檔案: Monica.sh
将dos指令符修改為unix [可選]
由于lz使用的是windows系統,需要将檔案轉碼
參考文獻
inotify用法簡介及以之結合rsync實作主機間的檔案實時同步
Inotify: 高效、實時的Linux檔案系統事件監控架構