web-dev-qa-db-ja.com

tail -f、ファイルが書き込まれなくなったかどうかを判別します

使ってます 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が入力を受信しなくなったこと)を検出し、イベントを警告するメッセージを画面にエコーする最も簡単で効率的な方法は何ですか?

7
BryanK

少なくともLinuxを実行している場合は、これを逆方向に実行しています。書き込まれているファイルに反応するには、inotifyを使用する必要があります。

#!/bin/sh
while inotifywait -qe modify filename
do

done

それで十分です。

7
chx

ログファイルが開いているすべてのプロセスのプロセス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"
6
John1024
#!/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に出力されます。これは、ファイルをテールフィングしているときにターミナルに表示されます。

2
Creek