我正在监视日志文件中是否有会触发电子邮件的关键字。问题是代码不断产生电子邮件。即使同一关键字有多行,我也只希望收到一封电子邮件。
我尝试了以下操作:
'{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"
所需结果是在发送第一封电子邮件后结束所有电子邮件,或者在发送第一封电子邮件后结束电子邮件和监视。我宁愿只结束电子邮件操作并继续监视,但会结束所有事情。
答案 0 :(得分:1)
如果服务器重新启动时还有另一条日志消息,则可以在看到断开连接消息时设置一个变量,并在看到重新连接消息时将其清除。
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 }'
答案 1 :(得分:0)
请不要接受这个答案,因为这只是对Barmar发布的内容的修饰,后者只是为了展示一种无冗余的替代实现方式:
awk '
/disconnect_tcp_conn/ { report("down") }
/reconnect_tcp_conn/ { report("up") }
function report(curr_state, msg) {
if ( prev_state != curr_state ) {
msg = "Server is " curr_state
system("mail -s \047" msg "\047 mail@gmail.com </dev/null")
print msg | "cat>&2"
prev_state = curr_state
}
}
'