
$ 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メールを送信します。