首页 > 解决方案 > 在 AWK 中结束导致动作无限生成的系统操作

问题描述

我正在监视将触发电子邮件的关键字的日志文件。问题是代码无休止地生成电子邮件。即使有几行相同的关键字,我也希望只收到一封电子邮件。

我尝试了以下方法:

'{if(!seen[$1]++)print $1}'

但我不知道如何或在何处将其应用于现有代码:

tail -fn0 user | awk '/disconnect_tcp_conn/ { 
    system("mail -s \"Server is down\" mail@gmail.com </dev/null") 
    print "Server is Down"

期望的结果是在第一封电子邮件发送后结束所有电子邮件发送,或者在发送第一封电子邮件后结束电子邮件发送和监控。我更喜欢只结束电子邮件操作并继续监控,但除了结束一切之外。

标签: linuxbashawk

解决方案


如果服务器恢复时还有另一条日志消息,您可以在看到断开连接消息时设置一个变量,并在看到重新连接消息时清除它。

tail -fn0 user | awk '
    !server_down && /disconnect_tcp_conn/ { 
        system("mail -s \"Server is down\" mail@gmail.com </dev/null") 
        print "Server is Down"
        server_down = 1 }
    server_down && /reconnect_tcp_conn/ {
        system("mail -s \"Server is up\" mail@gmail.com </dev/null") 
        print "Server is Up"
        server_down = 0 }'



推荐阅读