我编写了一个脚本,它在日志中查找一个单词,如果找到该单词(错误),则发送电子邮件,该脚本每小时运行一次,如果找到该单词(错误),它将在那里呆一天,第二天日志再次开始,可能找不到错误。
因此,如果发现该错误,每小时运行的脚本都会每小时向我发送相同的电子邮件,我怎样才能在两次或仅一次之后停止发送。
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
执行脚本的用户具有写权限的目录不同的目录。