使ってます tail -f
ログファイルの増加を追跡します。ログファイルに書き込んでいるプロセス(クラッシュまたは終了した場合)がファイルにアクセスまたは書き込みを行っていないかどうかを検出する方法を見つけるのに問題があります。
これが私が使用しているスクリプトです
tail -f log_file | while read LOGLINE
do
echo -e "${LOGLINE}"
if [[ "${LOGLINE}" == *ERROR* ]] ; then
echo -e "ERROR FOUND : ${LOGLINE}\n"
# handle the error here
fi
done
ログファイルへの書き込みプロセスが停止したこと(またはtail -fが入力を受信しなくなったこと)を検出し、イベントを警告するメッセージを画面にエコーする最も簡単で効率的な方法は何ですか?
少なくともLinuxを実行している場合は、これを逆方向に実行しています。書き込まれているファイルに反応するには、inotify
を使用する必要があります。
#!/bin/sh
while inotifywait -qe modify filename
do
done
それで十分です。
ログファイルが開いているすべてのプロセスのプロセスIDを取得するには、lsof
を使用します。
lsof -Fp /path/to/your/logfle
これは、実際にファイルを開いているプロセスのみを表示することに注意してください。実際にファイルに書き込む必要がある短い瞬間を除いて、ファイルを閉じたままにするプログラムを見逃す可能性があります。
lsof
はスクリプトに対応しており、多くのオプションがあります。見る man lsof
。
ログファイルを開いた状態でプロセスがなくなると、画面にメッセージを書き込むスクリプトを次に示します。
while lsof -Fp /tmp/mylogfile >/dev/null
do
sleep 1
done
echo "No processes have the log file open"
上記には落とし穴があります:あなたのtail -f
プロセスはファイルを開きます。代わりに、そのファイルを開いているプロセスの数が2を下回ったときに、メッセージを表示することをお勧めします。
while [ "$(lsof -Fp /tmp/mylogfile | wc -l)" -ge 2 ]
do
sleep 1
done
echo "There are less than two processes with the log file open"
#!/bin/bash
PROC=Apache2 # insert your process name here
while true; do
pgrep $PROC > /dev/null # hides pgrep's output
if [[ $? -ne 0 ]]; then
echo "Call 911 $PROC died!" 1>&2 # redirects to stderr
exit
fi
sleep 1
done
したがって、これをlifealert.sh
のように呼び出し、./lifealert.sh &
のようにバックグラウンドで実行します。
Ifステートメントが起動すると、stderrに出力されます。これは、ファイルをテールフィングしているときにターミナルに表示されます。