2012-04-15 54 views
1

我正在嘗試讀取不斷變化的日誌文件(即文本文件),並在該文件中找到的某些文本上生成警報。我想通過bash腳本來做到這一點,但我很困惑,一旦某些文本進入該日誌文件,我將如何調用我的程序。如何讀取動態更改的文件

換句話說,我怎樣才能始終在該文件上進行檢查,以便每當某個特定文本進入該文件時,我都會對該文本發出警報。任何函數調用?或者是其他東西?請指教。

回答

2

我想我會去了解它的方式是這樣的:

首先,我將創建一個bash腳本和一個文本文件,bash腳本將首先將該日誌文件的行數存儲在文本文件中,然後添加該腳本的cron。

腳本將計算該文件的行並將其與存儲在文本文件中的行數

你可以做,使用命令

wc -l filename 

如果行數爲那麼日誌已經更新了,我會計算出當前的行數減去存儲在文本字段中的數量,並且我會知道自上次檢查以來已經添加了多少行,然後使用這個命令獲取這些行

tail -n $number_of_lines filename 

我會循環輸出並執行所需的操作,如果其中一行符合您的條件,然後更新包含行數的文本文件,我會寫你bash腳本,但我想你已經得到了想法

編輯:您可以執行這個腳本(只寫你的代碼搜索的匹配等)

#!/bin/bash 

NUMBER=`/bin/cat ./numberoflines` 
LINES=`/usr/bin/wc -l < /var/log/messages` 

DIFFERENCE=$(($LINES-$NUMBER)) 

if [ $DIFFERENCE != 0 ]; then 
tail -n $DIFFERENCE /var/log/messages |while read line 
do 
if $(echo $line | grep --quiet 'New USB device found') 
then 
     # Email text/message 
     EMAIL='[email protected]' 
     SUBJECT="New USB device found" 
     EMAILMESSAGE="/tmp/emailmessage.txt" 
     echo "New USB device found etc ..." > $EMAILMESSAGE 
     /bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE 
fi 
done 
echo "$LINES" > ./numberoflines 
fi 

即使你不能添加任何crons,那麼你仍然可以無論如何執行這個腳本,看看有什麼你想匹配並檢查並執行你需要的代碼

+0

@ Al-Kateb:這是一個好主意,但對不起,如果我沒有提到我不能在cronjob中添加任何東西。我必須編寫完整的功能,將像其他任何OS程序一樣運行。無法在crontab中添加此項工作。 – user115079 2012-04-15 11:01:31

+0

儘管你仍然可以從命令行執行該腳本,但檢查更新的答案它有一個小的bash腳本,可以幫助你做到這一點 – 2012-04-15 11:33:53

+0

這可能會在每個通話過程中有很大的日誌文件(一些10G)的生產環境中發生危險:建議的腳本文件被完全讀取 - 這可能是一個性能問題。 – 2012-04-15 12:48:13

4

也許這可以讓你開始。試試這個test.sh腳本了:

#/bin/sh 

while read line 
do 
echo `date` " $line" 
done 

現在嘗試調用它像這樣(QWE是一些線條簡單的文本文件):

./test.sh < qwe 

它會讀取線形成QWE和打印,直到EOF。

現在調用它是這樣的:

tail -f qwe | ./test.sh 

現在它會讀取行,但它不會在EOF停止,而是要等待下一行。

如果你這樣做在一個單獨的終端:

`echo "hi" >> qwe` 

你看..

0
watch -n 0.1 cat /proc/uptime 

其中n是以秒爲單位的間隔時間。

man watch 欲瞭解更多信息。