linux /var/log/message的警报脚本

kt06eoxx  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(109)

请考虑:

#!/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 *。

cig3rfwq

cig3rfwq1#

你需要一些方法来记住你已经看到了什么。最简单的方法就是把你的 msg 存储在一个文件中,下次你收到一条消息时,你就把它放在你的“状态”文件中,只有当有新的东西时才发送一封邮件。
作为一种更高级的方法,您可以围绕logtail构建脚本。它只能给予自上次调用以来日志文件的新行。(在Debian上它是自己的软件包logtail
或者,您可以使用现有的项目,例如logcheck,而不是编写自己的日志监视器脚本。

vs3odd8k

vs3odd8k2#

要实现仅在test.service有新日志条目时发送电子邮件的功能,可以在单独的文件中跟踪最后处理的日志条目。下面是您的脚本的更新版本,它可以完成此任务:

#!/bin/bash

log_file="/home/testaccount/test.log"
last_handled_file="/path/to/last_handled.log"

# Read the last handled log entry timestamp from the file
if [ -f "$last_handled_file" ]; then
    last_handled=$(cat "$last_handled_file")
else
    last_handled=""
fi

# Get the most recent log entry with test.service within the last 30 minutes
msg=$(find "$log_file" -mmin -30 -exec grep test.service {} \; | tail -1)

# Check if there's a new log entry and it differs from the last handled one
if [ -n "$msg" ] && [ "$msg" != "$last_handled" ]; then
    echo "$msg" |
    mail -r 'database@alert.etc' -s 'Database Alert' test@gmail.com

    # Update the last handled log entry timestamp in the file
    echo "$msg" > "$last_handled_file"
fi

字符串
在这个版本中,我们引入了一个last_handled_file变量,它指向存储最后一个已处理日志条目的文件的路径。当脚本运行时,它从这个文件中读取最后一个处理的条目(如果存在的话)。处理完新的日志条目后,它会将其与上一次处理的条目进行比较,如果它们不同,它会发送一封电子邮件,并使用新的日志条目更新last_handled_file
确保将/path/to/last_handled.log替换为您希望存储最后一个已处理日志条目的实际路径。
通过使用这种方法,脚本将仅在有新的日志条目时使用test.service发送电子邮件,并且不会每30分钟通过电子邮件重复发送相同的日志条目。

相关问题