2013-12-11 59 views
0

我需要觀察文件(現有或新創建)更改的目錄並計算日誌中出現的次數ERROR。當它看到一條新線OKAY時,它將錯誤計數器重置爲0(零)。一旦它再次在新行中找到ERROR,該腳本會不斷重複相同的過程。不斷監控目錄/文件以進行錯誤報告

#!/bin/bash 
# 
log="/tmp/running.txt" 
ref=${log}.ref 
TERR=${TERR:-0} 

if [ -e $log ]; then 
    if [ ! -e $ref ] || find $log -newer $ref | grep . > /dev/null 
    then 
     touch -r $log $ref 
     gStr="tail -1 $log | grep -m1 -Fe 'ERROR'" 
     echo -e "[$(date)] #-------------- CHANGE(s) DETECTED --------------#" 

     [[ -n $(eval $gStr) ]] \ 
     && { echo " ---- $(eval $gStr) --- "; export TERR=$((TERR+1)); } \ 
     || { echo -e " ***** It's OKAY now *****"; export TERR=0; } 
     echo "Error counter: $TERR" 

     echo -e "[$(date)] #-------------- End of Check ---------------#\n" 
    fi 
fi 

我開始用一個單一的文件(檢查,而不是在該目錄多個文件),這就是我來了這麼遠,這是在新的追趕ERROROKAY方面的工作好嗎行,但不知道在跟蹤OKAY之前跟蹤錯誤報告的數量。我試着沒有任何快樂地運行這個scrit (. ./chkError.sh)TERR=$((TERR+1))似乎沒有工作。任何想法我該怎麼做?

另一個相關的問題是,我將此腳本作爲cron-job運行,即每分鐘運行一次,這可能是不夠的。我還能做些什麼使它在後臺運行?乾杯!!

+2

檢查inotify和inotifytools。 – wildplasser

+0

@wildplasser:已經檢查出這種可能性,但問題是'inotify | inotifytools'不是標準安裝的一部分,我無法確定那些工具是否安裝在該特定節點上。所以得到了可用的東西。乾杯!! – MacUsers

回答

0

我會結合時間戳保護和增量處理(my 20-liner),通過可配置的過濾器輸出輸出,在您的案例| egrep '^ERROR',因此只報告新的錯誤。

如果您確實需要使其接近實時,那麼在每個文件上運行tail -f xxx.log監視器,並將混合警報批處理配置爲輸出過濾器。

1

linux內核包含一個相對便宜的子系統,用於完成這件事,並且是最可靠和經過驗證的做你想做的事情的方法。你在你的代碼中註冊一個「watch」來查找目錄上的特定事件,當發生一個事件時內核會通知你,然後你的代碼運行一個函數,然後你可以對該文件做些什麼。

http://en.wikipedia.org/wiki/Inotify

我知道你可能不想寫C代碼,但它是相對容易的,如果你知道這些語言寫在Python或Perl的東西要做到這一點?甚至只是一個包裝器來註冊inotify手錶,然後觸發一個shell腳本。

https://github.com/seb-m/pyinotify

+0

我可以使用Python(或perl,如果我真的需要的話),但只要它使用標準庫中提供的工具即可:在這種情況下,pyinotify不是這樣。看着'inotify',但又需要'inotify-tools'來安裝 - 對吧?或者我在這裏錯過了什麼? – MacUsers

+0

inotify是一個核心的Linux內核子系統,並始終可用。使用該核心內核inotify子系統的庫(pyinotify)或命令行工具(inotify-tools)可能或可能不在您的發行版中。如果沒有,並且你不想安裝它們,那麼你必須直接編寫針對庫的C程序來使用inotify。 – Mark