仅在条件满足时运行 crontab

仅在条件满足时运行 crontab

我有一个 bash 脚本,只要 Web 服务器没有响应,它就会向我发送电子邮件,并且该脚本cron每 5 分钟运行一次。但是,如果网站瘫痪几个小时,我就会收到太多消息,而不仅仅是一条。

让它只发送一次电子邮件的最佳方法是什么?我应该使用环境变量并在发送电子邮件之前检查它/当网络服务器再次启动时重置它吗?有没有更好的方法来做到这一点(不污染环境)?我现在正在做一些愚蠢的事情吗?我对自己的 shell 脚本技能没有信心。

#!/bin/sh

output=$(wget http://lon2315:8081 2>&1)
pattern="connected"

if [[ ! "$output" =~ "$pattern" ]]
then
    echo "$output" | mail -s "Website is down" "[email protected]"   
fi

答案1

我认为您不能使用环境变量,因为它们不会在脚本“运行”之间持续存在。

或者,您可以将内容写入/tmp主目录中的某个临时文件,然后每次都检查它?

例如,类似的东西

#!/bin/sh

output=$(wget http://lon2315:8081 2>&1)
pattern="connected"
tempfile='/tmp/my_website_is_down'

if [[ ! "$output" =~ "$pattern" ]]
then
    if ! [[ -f "$tempfile" ]]; then
        echo "$output" | mail -s "Website is down" "[email protected]"
        touch "$tempfile"
    fi
else
    [[ -f "$tempfile" ]] && rm "$tempfile"
fi

答案2

它有点脏,但我会把一个文件放在/tmp或其他地方,当服务器再次备份时,该文件会被删除。

也许是这样的:

#!/bin/sh

output=$(wget http://lon2315:8081 2>&1)
pattern="connected"
websitedownfile="/tmp/websitedown"

if [[ ! "$output" =~ "$pattern" ]]; then

    if [[ -e $websitedownfile ]]; then
        echo "$output" | mail -s "Website is down" "[email protected]"
    fi
    touch $websitedownfile
else
    [[ -f $websitedownfile ]] && rm $websitedownfile
fi

相关内容