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

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

因此,如果发现错误,每小时运行的脚本会每小时向我发送相同的电子邮件,如何在2次或仅一次后停止发送。

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

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

例如,要将文件用作标志,您可以通过以下方式修改脚本:

 #!/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}" ] [ ! -f "${FLAG_FILE}" ] 。 阅读有关Bash条件表达式的信息 。

如果您想发送/接收一定数量的电子邮件然后禁止脚本的function,您可以添加第三个条件,其中$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 

请注意, &&具有前一个条件返回true||含义 表示先前条件是否返回false

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