我有一个 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