常に変化するログ ファイル (テキスト ファイル) を読み込んで、そのファイルにあるテキストについてアラートを生成しようとしています。bash スクリプトを使用して実行したいのですが、そのログ ファイルにテキストが入ったらすぐにプログラムを呼び出す方法がわかりません。
言い換えれば、特定のテキストがそのファイルに入るたびにそのテキストに関するアラートを受け取るように、そのファイルを常にチェックし続けるにはどうすればよいでしょうか。関数呼び出し?または、他の何か?お知らせ下さい。
多分これはあなたが始めることができます。この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`
分かりますか..
私がそれについて行くと思う方法はこれです:
まず、bashスクリプトとテキストファイルを作成します。bashスクリプトは、最初にそのログファイルの行数をテキストファイルに保存し、次にそのスクリプトのcronを追加します。
スクリプトはそのファイルの行数をカウントし、テキストファイルに保存されている行数と比較します
コマンドを使用してそれを行うことができます
wc -l filename
行数が多い場合はログが更新され、現在の行数からテキストフィールドに格納されている数を引いた数を計算します。これにより、前回のチェック以降に追加された行数がわかり、これを使用します。それらの行をフェッチするコマンド
tail -n $number_of_lines filename
行の1つが条件に一致する場合は、出力をループして目的のアクションを実行し、行数を保持するテキストファイルを更新します。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='youremail@gmail.com'
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
cronに何も追加できない場合でも、とにかくこのスクリプトを実行できます。一致させたいものを確認し、そこで必要なコードを確認して実行します。