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)
缺点是在第一次测试失败的情况下重新请求页面。这次请求可能会成功,您将不会看到错误。当然,可以存储输出并将其作为附件发送,但这会使脚本更加复杂。
看看这个脚本:
curl
是一个用于获取 URL 的命令行实用程序。该脚本检查退出代码($? 指的是 shell 脚本中最近命令的退出代码),如果它不是 0,则报告错误(退出代码 0 通常表示成功)。正如 HUB 的回答中提到的,||
当第一个命令失败时,您也可以在命令行上运行第二个命令。
一旦你弄清楚状态,你只需要给自己发送一些邮件。下面是一个使用mail
命令从 shell 脚本发送邮件的示例,假设您正在测试的框具有 SMTP 设置:
顺便说一句:如果您不擅长 shell 脚本,请不要将自己限制在 shell 脚本中。您可以使用 ruby 脚本、php 脚本、您的服务器可以运行的任何类型的脚本!只需#!/path/to/executable
在脚本的开头添加一行 - 例如:
#!/usr/bin/php
检查这个脚本。它正在检查网站列表,并在出现问题时发送电子邮件(到电子邮件列表)(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)
小智 1
我会为此推荐 pingdom。他们的免费服务允许您检查 1 个站点,但这就是您检查 1 台服务器所需的全部内容。如果您有 iPhone,他们会免费向您推送消息,因此无需从他们那里购买短信积分,并且他们有多种您可以使用的设置。我的设置是在 2 次重试(10 分钟)后通知我,此后每 10 分钟停机一次。这太棒了,因为它还检查指示站点已关闭的 HTTP 500 消息。如果失败,它会立即从不同位置的不同服务器再次检查您的站点。如果失败了,那么,这会触发您对如何/何时收到通知的偏好。