linux inotifywait脚本,使用inotify/fswatch构建自动监控脚本
自動告警腳本
最近項目上有這樣一個需求:系統中有一個后臺服務會不斷的生成監控日志,根據系統的運行情況,它每天會在目錄/var/alarms下生成一個文件,文件名帶有時間戳,其中內容格式如下:
$cat /var/alarms/alarms-20150228130522.csvnode,summary,occurrence,proiorityVIQ002,heartbeat failure,2/12/2015 01:23 AM,criticalVIQ002,packages are rejected,2/12/2015 01:22 AM,majorVIQ002,connection cannot be established,2/11/2015 01:23 AM,mediumVIQ001,packages are rejected,2/11/2015 01:23 AM,warningVIQ001,connection cannot be established,2/09/2015 01:23 AM,medium...
運維團隊需要監控這個目錄,如果里邊的文件發生了變化,就要及時的發送郵件給工程團隊解決。我們當然不可能人工的監控該目錄,然后編寫郵件,再拷貝粘貼,所以需要編寫一個腳本來自動化這個任務。
處理方法有兩種:
編寫一個crontab的任務,每隔五分鐘輪詢一下,然后編寫腳本來探測變化,發送郵件
使用操作系統提供的inotify相關API探測變化,編寫腳本發送郵件
不過作為程序員,第二種方法顯然更高級一些。另外相對于檢測文件變化(對比目錄樹,檢查時間戳,而且還要記錄上一次變更的狀態等),編寫一個發送郵件的腳本要簡單得多。
使用inotify
如果在Linux下,我們可以使用inotify相關的工具,你可以使用你正在使用的系統下的包管理工具來安裝。也可以直接從源碼包編譯安裝。
安裝之后,系統中就有了一個叫做inotifywait的命令,這個命令提供多個參數。默認的inotifywait在接收到指定的事件(文件變化)后,會打印信息并退出。可以使用-m參數讓inotifywati處于監聽狀態。-e參數指定需要監聽的事件類型,下面是幾個常見的事件類型:
CREATE,創建
MODIFY,修改
CLOSE_WRITE,CLOSE,寫入成功
還可以通過--format來指定事件的輸出,%w表示監控的文件名,%f表示如果被監控的對象是目錄,則當發生事件時返回文件名。比如下面的命令:
$inotifywait -m -e close_write /var/alarms --format "%w%f"
表示以監控模式(事件發生后不退出,繼續監聽),監聽close_write事件,在/var/alarms目錄上,并且輸出的格式為%w%f。
這樣我們在另一個窗口上模擬事件發生:
$touch /var/alarms/alarms-20150228130522.csv
當前的窗口就會出現/var/alarms/alarms-20150228130522.csv這樣的輸出。有了這個功能,我們只需要編寫一段簡單的腳本就可以完成上一小節中的問題了:
#!/bin/bashDIR=$1inotifywait -m -e close_write $DIR --format "%w%f" | whilereadFILEdocat ${FILE} | mail -s "Alarm: $FILE" juntao.qiu@gmail.comdone
命令mail是Linux下默認的郵件客戶端,可以完成郵件的發送功能。將上邊的腳本命名為monitor.sh,添加可執行權限,并啟動監控:
$chmod +x monitor.sh$./monitor.sh /var/alarms
這樣,當目標目錄/var/alarms發生變化后,我們就可以收到告警郵件了!
Mac OSX下使用fswatch
如果是在Mac OSX下,雖然沒有了inotify相關的API,但是我們可以使用fswatch來完成同樣的工作。
使用brew安裝fswatch:
$brew install fswatch
即可。fswatch也有很多選項,我們這里僅使用-0(表示以傳統的NUL作為字符串終結符,因為*nix下文件名可以包含任意字符,比如空格)。我們可以很容易的用xargs將檢測到的事件進行進一步的處理:
fswatch -0 /var/alarms | xargs -0 -n 1 ~/bin/send-notify.sh
其中,-0的意思與fswatch的命令中的-0一致,-n 1表示每條NUL結尾的字符串都執行一次腳本。腳本send-notify.sh的內容如下:
#!/bin/bashFILE=$1cat $FILE | mail -s "Alarm: $FILE" jutao.qiu@gmail.com
這樣,當文件發生變化時,腳本就會發送一封郵件到指定郵箱了(由于我自己的laptop的hostname不像是一個合理的主機名,所以Gmail會把這封郵件放到垃圾郵件列表中,這里只是用作示例而已)。
當然,由于腳本是我們自己可以編寫的,所以理論上當檢測到變化之后,我們可以做任何事情,比如說幾句話,播放一段音樂等。
總結
以上是生活随笔為你收集整理的linux inotifywait脚本,使用inotify/fswatch构建自动监控脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 侵华日军七三一细菌部队孙吴支队罪证遗址怎
- 下一篇: 揭秘解放军最新单兵装备