クラッシュしたアプリケーションのログファイル(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