メッセージが停止したら、ログに従いコマンドを実行します。

メッセージが停止したら、ログに従いコマンドを実行します。

ログを追跡し、特定のメッセージを検索するスクリプトを作成する必要があります。スクリプトはメッセージが表示されたときにログを監視し続け、メッセージが5秒間再び表示されない場合は、コマンドを実行するスクリプトが必要です。

これは擬似コードです:

後続のログファイルに「エラーが発生しました」というメッセージが見つかりました。このメッセージは10〜20回繰り返されます。メッセージのスクロールが停止してから5秒待ってから、「systemctl restart myservice」を実行します。

awkを使用しようとしていますが、コマンドを実行する前にメッセージがスクロールを停止するのを待つ方法がわかりません。これは私のコードです。

tail -F /var/log/mylog.log | awk '
                    /TestString goes here/ { system("sleep 5; systemctl restart myservice") }'

答え1

bashcorutilsと中間ファイルを使用してtimeoutこれを行うことができます。

server.bash を再起動します。

# Wait for the initial "TestString"
tail -n0 -F logfile |
while IFS= read -r; do 
  if [[ "$REPLY" == TestString ]]; then 
    break
  fi
done

# See if "TestString" repeats at least every 5 seconds
touch ts
while [ -e ts ]; do
  rm -f ts
  timeout 5 bash -c '
tail -n0 -f logfile |
while IFS= read -r; do 
  if [[ "$REPLY" == TestString ]]; then 
    touch ts
  fi
done
'
done

systemctl restart myserver

バラよりグレッグのウィキBash 読み込み中のループに関する追加情報。

関連情報