如果已经发现错误并发送,则 Shell 脚本将停止重复发送相同的电子邮件

如果已经发现错误并发送,则 Shell 脚本将停止重复发送相同的电子邮件

我编写了一个脚本,它在日志中查找一个单词,如果找到该单词(错误),则发送电子邮件,该脚本每小时运行一次,如果找到该单词(错误),它将在那里呆一天,第二天日志再次开始,可能找不到错误。

因此,如果发现该错误,每小时运行的脚本都会每小时向我发送相同的电子邮件,我怎样才能在两次或仅一次之后停止发送。

if grep 'error' "/path to log"; then
    echo "error found" | mailx -s "error alert" email-id
fi

答案1

您可以使用第二个条件,该条件使用某些变量(或文件)作为标志(或计数器)。

例如,要使用文件作为标志,您可以按以下方式修改脚本:

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ]; then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
fi

该命令将创建在第二个条件中用作参数的touch "$FLAG_FILE"文件。/tmp/flag_file_my_error_email_script[ ! -f "${FLAG_FILE}" ]阅读有关 Bash 条件表达式的内容

如果您想要发送/接收一定数量的电子邮件,然后抑制脚本的功能,您可以添加第三个条件,其中的内容$FLAG_FILE将用作柜台

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ] || (( $(cat "$FLAG_FILE") < 2 )); then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
        NEW_VALUE=$(( $(cat "$FLAG_FILE") + 1)) && echo "$NEW_VALUE" > "$FLAG_FILE"
fi

请注意,&&含义为如果先前的条件返回真的||手段如果先前的条件返回错误的

如果您想恢复脚本的“正常”工作,则应删除$FLAG_FILE。系统重启时会自动删除此文件。如果您想更改该行为,请选择与/temp执行脚本的用户具有写权限的目录不同的目录。

相关内容