从多行 grep 输出发送电子邮件

从多行 grep 输出发送电子邮件

不会抓取 $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

将“--line-buffered”添加到 grep 命令中。但正如 @Nick 的回答所述,您将收到每行的一封电子邮件。可能只想从 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 上进行了测试,我相信它可以实现您想要完成的任务。首次启动脚本时,如果日志文件底部附近有“FATAL”消息,您可能会收到几封电子邮件。

#!/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 行之前打印四行,因此您将发送五封电子邮件,而不是一封。

相关内容