我正在嘗試讀取不斷變化的日誌文件(即文本文件),並在該文件中找到的某些文本上生成警報。我想通過bash腳本來做到這一點,但我很困惑,一旦某些文本進入該日誌文件,我將如何調用我的程序。如何讀取動態更改的文件
換句話說,我怎樣才能始終在該文件上進行檢查,以便每當某個特定文本進入該文件時,我都會對該文本發出警報。任何函數調用?或者是其他東西?請指教。
我正在嘗試讀取不斷變化的日誌文件(即文本文件),並在該文件中找到的某些文本上生成警報。我想通過bash腳本來做到這一點,但我很困惑,一旦某些文本進入該日誌文件,我將如何調用我的程序。如何讀取動態更改的文件
換句話說,我怎樣才能始終在該文件上進行檢查,以便每當某個特定文本進入該文件時,我都會對該文本發出警報。任何函數調用?或者是其他東西?請指教。
我想我會去了解它的方式是這樣的:
首先,我將創建一個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,那麼你仍然可以無論如何執行這個腳本,看看有什麼你想匹配並檢查並執行你需要的代碼
也許這可以讓你開始。試試這個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`
你看..
watch -n 0.1 cat /proc/uptime
其中n是以秒爲單位的間隔時間。
做 man watch
欲瞭解更多信息。
@ Al-Kateb:這是一個好主意,但對不起,如果我沒有提到我不能在cronjob中添加任何東西。我必須編寫完整的功能,將像其他任何OS程序一樣運行。無法在crontab中添加此項工作。 – user115079 2012-04-15 11:01:31
儘管你仍然可以從命令行執行該腳本,但檢查更新的答案它有一個小的bash腳本,可以幫助你做到這一點 – 2012-04-15 11:33:53
這可能會在每個通話過程中有很大的日誌文件(一些10G)的生產環境中發生危險:建議的腳本文件被完全讀取 - 這可能是一個性能問題。 – 2012-04-15 12:48:13