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が入力を許可しなくなりました)、イベントを通知するメッセージを画面に表示する最も簡単で効率的な方法は何ですか?
答え1
少なくともLinuxを実行している場合は、逆に行っているのです。inotify
作成中のファイルに反応を使用する必要があります。
#!/bin/sh
while inotifywait -qe modify filename
do
done
それはすべてです。
答え2
ログファイルが開いているすべてのプロセスのプロセス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"
答え3
#!/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として印刷され、ファイルを追跡するときに端末でそれを見ることができます。