请考虑:
#!/bin/bash
msg=$(find /home/testaccount/test.log -mmin -30 -exec grep test.service {} \; | tail -1)
test -n "$msg" &&
echo "$msg" |
mail -r 'database@alert.etc' -s 'Database Aler' test@gmail.com
字符串
上面有一个脚本。当有一个文件为 * test.service * 的日志时,它会给我发电子邮件。我已经把它放在cron中,它会每30分钟运行一次,但我现在的问题是它总是每30分钟发一次相同的日志。
有没有办法给我发一次电子邮件,然后如果它再次读取相同的日志,它将停止给我发电子邮件?
我需要阻止它每30分钟发送相同的日志,如果有一个新的警报,它只会给我发电子邮件,上面有 * test.service *。
2条答案
按热度按时间cig3rfwq1#
你需要一些方法来记住你已经看到了什么。最简单的方法就是把你的 msg 存储在一个文件中,下次你收到一条消息时,你就把它放在你的“状态”文件中,只有当有新的东西时才发送一封邮件。
作为一种更高级的方法,您可以围绕logtail构建脚本。它只能给予自上次调用以来日志文件的新行。(在Debian上它是自己的软件包
logtail
)或者,您可以使用现有的项目,例如logcheck,而不是编写自己的日志监视器脚本。
vs3odd8k2#
要实现仅在
test.service
有新日志条目时发送电子邮件的功能,可以在单独的文件中跟踪最后处理的日志条目。下面是您的脚本的更新版本,它可以完成此任务:字符串
在这个版本中,我们引入了一个
last_handled_file
变量,它指向存储最后一个已处理日志条目的文件的路径。当脚本运行时,它从这个文件中读取最后一个处理的条目(如果存在的话)。处理完新的日志条目后,它会将其与上一次处理的条目进行比较,如果它们不同,它会发送一封电子邮件,并使用新的日志条目更新last_handled_file
。确保将
/path/to/last_handled.log
替换为您希望存储最后一个已处理日志条目的实际路径。通过使用这种方法,脚本将仅在有新的日志条目时使用
test.service
发送电子邮件,并且不会每30分钟通过电子邮件重复发送相同的日志条目。