我是一名独立的 Web 开发人员,拥有自己的 Centos VPS,为客户托管一些小型网站。今天我发现我的 httpd 服务已停止(原因不明 - 但那是另一个话题)。我重新启动了它,但现在我需要找到一种方法,如果再次发生这种情况,我可以通过电子邮件和/或短信收到通知 - 我不喜欢客户打电话告诉我他们的网站无法正常工作!
我知道可能有很多不同的可能性,包括服务器监控软件。我认为我真正需要的是一个脚本,我可以将其作为 cron 作业从我的开发主机(它在我的办公室中永久运行)运行,该脚本尝试从我的生产服务器加载页面,如果它在 30 秒内没有加载,它会向我发送电子邮件或短信。我对 shell 脚本很不擅长,因此提出了这个问题。
如有任何建议,我们将不胜感激。
答案1
好吧...我可以写出最简单的脚本:
/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" [email protected]
将其添加到 cron 中:
* * * * * /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" [email protected]
但如果存在问题,它却无法告诉你问题是什么,这太简单了。
更新:现在,这一行代码检查页面上的特定字符串(“正常操作字符串”),该字符串应该只在正常操作中出现。
UPD2:在电子邮件中发送错误页面的简单方法:
/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | /usr/bin/mail -v -s "Site is down" [email protected]
缺点是如果第一次测试失败,则需要重新请求页面。这次请求可能会成功,您不会看到错误。当然,可以存储输出并将其作为附件发送,但这会使脚本更复杂。
答案2
看一下这个脚本:
curl
是一个用于获取 URL 的命令行实用程序。该脚本检查退出代码($? 指的是 shell 脚本中最新命令的退出代码),如果退出代码不是 0,则报告错误(退出代码 0 通常表示成功)。正如 HUB 的回答中提到的,当||
第一个命令失败时,您也可以在命令行上运行第二个命令。
一旦弄清了状态,你只需给自己发送一些邮件即可。下面是一个使用命令mail
从 shell 脚本发送邮件的示例,假设你正在测试的框已设置 SMTP:
顺便说一句:如果你不擅长编写 shell 脚本,不要局限于使用 shell 脚本。你可以使用 ruby 脚本、php 脚本,以及你的服务器可以运行的任何类型的脚本!只需#!/path/to/executable
在脚本开头添加以下行即可 - 例如:
#!/usr/bin/php
答案3
查看这个脚本. 它会检查网站列表,一旦出现错误(http 响应不同于 200),就会发送电子邮件(发送到电子邮件列表)。该脚本会创建一个 .temp 文件来“记住”上次检查时失败的网站,这样您就不会收到多封电子邮件。当网站恢复运行时,.temp 文件将被删除。
#!/bin/bash
# list of websites. each website in new line. leave an empty line in the end.
LISTFILE=/scripts/isOnline/websites.lst
# Send mail in case of failure to. leave an empty line in the end.
EMAILLISTFILE=/scripts/isOnline/emails.lst
# `Quiet` is true when in crontab; show output when it's run manually from shell.
# Set THIS_IS_CRON=1 in the beginning of your crontab -e.
# else you will get the output to your email every time
if [ -n "$THIS_IS_CRON" ]; then QUIET=true; else QUIET=false; fi
function test {
response=$(curl --write-out %{http_code} --silent --output /dev/null $1)
filename=$( echo $1 | cut -f1 -d"/" )
if [ "$QUIET" = false ] ; then echo -n "$p "; fi
if [ $response -eq 200 ] ; then
# website working
if [ "$QUIET" = false ] ; then
echo -n "$response "; echo -e "\e[32m[ok]\e[0m"
fi
# remove .temp file if exist.
if [ -f cache/$filename ]; then rm -f cache/$filename; fi
else
# website down
if [ "$QUIET" = false ] ; then echo -n "$response "; echo -e "\e[31m[DOWN]\e[0m"; fi
if [ ! -f cache/$filename ]; then
while read e; do
# using mailx command
echo "$p WEBSITE DOWN" | mailx -s "$1 WEBSITE DOWN" $e
# using mail command
#mail -s "$p WEBSITE DOWN" "$EMAIL"
done < $EMAILLISTFILE
echo > cache/$filename
fi
fi
}
# main loop
while read p; do
test $p
done < $LISTFILE
将以下行添加到 crontab 配置 ($ crontab -e)
THIS_IS_CRON=1
*/30 * * * * /path/to/isOnline/checker.sh
答案4
我推荐使用 pingdom。他们的免费服务允许您检查 1 个站点,但您只需要检查 1 个服务器即可。如果您有 iPhone,他们会免费向您发送推送消息,因此无需从他们那里购买短信信用,并且他们有多种设置可供您使用。我的设置为在 2 次重试(10 分钟)后通知我,之后每 10 分钟停机一次。它很棒,因为它还会检查 HTTP 500 消息,指示站点已关闭。如果失败,它会立即从不同位置的另一台服务器再次检查您的网站。如果那一次失败,那么,这会触发您对如何/何时接收通知的偏好。