複数行のgrep出力からEメールを送信する

複数行のgrep出力からEメールを送信する

$ ERRORがキャッチされず、電子メールが受信されないか、テールが終了します。私は何が間違っていましたか?

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 "FATAL" | while read ERROR
do
    echo $ERROR | mail -s 'FATAL ERROR' [email protected] && pkill -P $$ tail
done

答え1

grep コマンドに "--line-buffered" を追加します。しかし、@Nickの回答によると、1行につき1つの電子メールが届きます。 grepコマンドから「-B4」パラメータを削除することもできます。

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 --line-buffered "FATAL" | while 
read ERROR
do
    echo "$ERROR" | mail -s 'FATAL ERROR' [email protected]
done

この試み。 CentOS 6.9 VMでテストした結果、あなたが望むように動作すると思います。スクリプトを初めて実行するときにログファイルの下部付近に「致命的な」メッセージがある場合は、いくつかの電子メールを受け取ることができます。

#!/bin/bash

tail -f --max-unchanged-stats=5 somelogfile.log | grep --line-buffered "FATAL" | while read ERROR
do
    grep -B4 "$ERROR" somelogfile.log \
    | mail -s 'FATAL ERROR' [email protected]
done 

答え2

tail と grep は標準出力をバッファリングし、while ループがこれを見ることができないようにすることができます。あなたが持っているならstdbuf(Linuxでは利用可能でなければなりませんが、他のシステムでも利用できるかどうかわからない)試してみてください。

stdbuf -o0 tail -F --max-unchanged-stats=5 somelogfile.log | stdbuf -o0 grep -B4 "FATAL" | while read ERROR ;do ... ;done

しかし、別の問題があります。while read ERRORループが行を読み取り、ERRORに割り当てるたびに発生します。 grepはFATAL行の前に4行を印刷し、1つではなく5つのEメールを送信します。

関連情報