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