複数のファイルの終わりをgrep

複数のファイルの終わりをgrep

クラッシュしたアプリケーションのログファイル(20-500)がたくさんあります。すべてのログファイルは、アプリケーションの単一実行で生成されます。つまり、各スレッドが独自のファイルに書き込む高度なマルチスレッドです。しかし、ログは大きい。 (場合によっては、それぞれ数百MBになる可能性があります)

スレッドの1つがクラッシュし、競合が発生した場合は、ログファイルの最後の100行にメッセージを書き込みます。時々、スレッドはすべて正常に終了し、行が記録されないことがあります。

競合するアプリケーションを実行するラッパースクリプトはbashにあり、この方法でアプリケーションがクラッシュするタイミングを検出して再起動できるようにしたいと思います。次よりも良いことができますか?

# We want to run at least once
CRASHED=1
while [ CRASHED -eq 1 ]
    # Run the app
    run_application
    # Check the end of all the logs for KEY
    CRASHED=0
    for x in logs/* ; do
      if tail -n 100 $x | grep "KEY" ; then
        CRASHED=1
        # We'll only find it once, so may as well bail out now
        break
      fi
    done
done  

私は主にログファイルのループを組み込みループに置き換えることができるかどうかに興味があります。ただ使えません。

grep "KEY" logs/* 

ファイルが大きすぎて効率が悪くなります。

ベストアンサー1

使用

tail --follow -n 100 *.log | grep -q key

クラッシュ時にアプリケーションが実際に終了すると、--followは省略されます。 https://linux.die.net/man/1/tail

おすすめ記事