tail -f、ファイルが[閉じる]に記録されていないことを確認します。

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が入力を許可しなくなりました)、イベントを通知するメッセージを画面に表示する最も簡単で効率的な方法は何ですか?

答え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として印刷され、ファイルを追跡するときに端末でそれを見ることができます。

関連情報