这是 bash 中的脚本。这里
它捕获字符串“错误:您的 TCP 连接已断开。”来自实时动态日志文件。这里是日志文件“TcpRcpt.log”的名称,其中包含下面的日志数据示例。
SAT Mar 26 19:55:37 2016 TCPRcpt-0297--ERROR: your TCP- connection is dead.
SAT Mar 26 19:55:37 2016 TCPRcpt-0297--RUNNING
SAT Mar 26 19:55:37 2016 TCPRcpt-0297--RUNNING
SAT Mar 26 19:55:37 2016 TCPRcpt-0298--ERROR: your TCP- connection is dead.
现在,发出步骤
logtail TcpRcpt.log | grep -m 1 "ERROR: your TCP- connection is dead." | sed 's/.*TCPRcpt-/ PID /;s/ -//' >> LOGFILE.LOG
即使它不捕获字符串,它也始终给出 0 值。这使得 if 条件每次在循环执行时都发送通知。
现在我的问题是:还有其他选择吗?每次捕获字符串时都会通过电子邮件通知?
答案1
“它总是给出 0 值”,因为这是管道中最后一个命令 - sed 的退出代码,即使没有发生替换,它也会成功(返回 0)。
环境管道故障选项将使管道的结果设置为管道中第一个失败命令的结果(如果有)。通过在调用 logtail 之前设置该选项来修改脚本:
...
set -o pipefail
logtail TcpRcpt.log | grep -m 1 "ERROR: your TCP- connection is dead." | sed 's/.*TCPRcpt-/ PID /;s/ -//' >> LOGFILE.LOG
...