自动测试网站是否可用的脚本

Xou*_*boy 20 scripting bash httpd cron system-monitoring

我是一名孤独的 Web 开发人员,拥有自己的 Centos VPS,为我的客户托管了一些小型网站。今天我发现我的 httpd 服务已经停止(没有明显的原因 - 但这是另一个线程)。我重新启动了它,但现在我需要找到一种方法,如果它再次发生,我可以通过电子邮件和/或短信通知我 - 当我的客户打电话给我告诉我他们的网站不起作用时,我不喜欢它!

我知道可能有很多不同的可能性,包括服务器监控软件。我认为我真正需要的是一个脚本,我可以从我的开发主机(它永久在我的办公室中运行)作为 cron 作业运行该脚本,该脚本尝试从我的生产服务器加载一个页面,如果它没有在 30 内加载秒然后它给我发送电子邮件或短信。我在shell脚本方面很垃圾,因此这个问题。

任何建议将不胜感激。

HUB*_*HUB 18

嗯...最简单的脚本,我可以写:

/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" your@e-mail.address
Run Code Online (Sandbox Code Playgroud)

将其添加到 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" your@e-mail.address
Run Code Online (Sandbox Code Playgroud)

但是如果问题存在,告诉你问题是什么就太简单了。

UPD:现在这个单行检查页面上的特定字符串(“正常操作字符串”),它应该只出现在正常操作中。

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" your@e-mail.address
Run Code Online (Sandbox Code Playgroud)

缺点是在第一次测试失败的情况下重新请求页面。这次请求可能会成功,您将不会看到错误。当然,可以存储输出并将其作为附件发送,但这会使脚本更加复杂。


mlt*_*tsy 8

看看这个脚本:

curl是一个用于获取 URL 的命令行实用程序。该脚本检查退出代码($? 指的是 shell 脚本中最近命令的退出代码),如果它不是 0,则报告错误(退出代码 0 通常表示成功)。正如 HUB 的回答中提到的,||当第一个命令失败时,您也可以在命令行上运行第二个命令。

一旦你弄清楚状态,你只需要给自己发送一些邮件。下面是一个使用mail命令从 shell 脚本发送邮件的示例,假设您正在测试的框具有 SMTP 设置:

顺便说一句:如果您不擅长 shell 脚本,请不要将自己限制在 shell 脚本中。您可以使用 ruby​​ 脚本、php 脚本、您的服务器可以运行的任何类型的脚本!只需#!/path/to/executable在脚本的开头添加一行 - 例如:

#!/usr/bin/php


ET-*_*-CS 6

检查这个脚本。它正在检查网站列表,并在出现问题时发送电子邮件(到电子邮件列表)(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
Run Code Online (Sandbox Code Playgroud)

将以下行添加到 crontab 配置 ($ crontab -e)

THIS_IS_CRON=1
*/30 * * * * /path/to/isOnline/checker.sh
Run Code Online (Sandbox Code Playgroud)

在 Github 上可用


小智 1

我会为此推荐 pingdom。他们的免费服务允许您检查 1 个站点,但这就是您检查 1 台服务器所需的全部内容。如果您有 iPhone,他们会免费向您推送消息,因此无需从他们那里购买短信积分,并且他们有多种您可以使用的设置。我的设置是在 2 次重试(10 分钟)后通知我,此后每 10 分钟停机一次。这太棒了,因为它还检查指示站点已关闭的 HTTP 500 消息。如果失败,它会立即从不同位置的不同服务器再次检查您的站点。如果失败了,那么,这会触发您对如何/何时收到通知的偏好。