找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3426|回复: 0

使用 cron、bash 和 wget 监控 Web 服务器的状态

[复制链接]
发表于 2012-3-26 14:04:10 | 显示全部楼层 |阅读模式
我最近需要一个真正真正简单的远程监控工具,用来跟踪服务器的可用性,我不需要记录运行时间以及其他别的信息,只是想知道服务器有没有异常挂机之类的。没找到这样的工具,我只好自己写一个。
尽管有很多这样的工具,而且都是开源免费的,例如 NagiosCacti 等等,但这些都太重了。我不需要那么复杂的,下面是我的基本需求列表:

  • 要求是 bash, wget, 以及 “mail” 命令 (sendmail, exim, postfix, 之类)
  • 可监控任何 HTTP/HTTPS URL, 检查 “200″ 状态返回
  • 检查请求返回时间,用于监控一些慢响应
  • 通过 Email 发送异常状态提醒
  • 可定制的接收异常信息的邮箱
  • 可定制慢响应的时间
  • 避免重复发送相同的异常提醒
  • 使用简单文本文件作为数据存储,不需要数据库
这些都非常的基本,但很有效。

简单的 crontab 作业定义
  1. */5 * * * * root /home/username/sitemonitor.sh
  2. sitemonitor.sh 脚本源码
  3. #!/bin/bash
  4. # Simple HTTP/S availability notifications script v0.1
  5. # March 20, 2012 by Jeff Rowberg - http://www.sectorfej.net
  6. HOSTS=( \
  7.     "http://www.yahoo.com" \
  8.     "https://www.google.com" \
  9.     "http://www.amazon.com" \
  10.     )
  11. NOTIFY_FROM_EMAIL="Site Monitoring <monitoring@example.com>"
  12. NOTIFY_TO_EMAIL="Server Admin <admin@example.com>"
  13. STATUS_FILE="/home/username/sitemonitor.status"
  14. SLOW_THRESHOLD=10
  15. OK_STATUSES=( "200" )
  16. ################################################################
  17. #        NO MORE USERMOD STUFF BELOW THIS, MOST LIKELY         #
  18. ################################################################
  19. # thanks to stackoverflow!
  20. # stackoverflow.com/questions/3685970/bash-check-if-an-array-contains-a-value
  21. function contains() {
  22.     local n=$#
  23. 28
  24.     local value=${!n}
  25.     for ((i=1; i < $#; i++)) {
  26.         if [ "${!i}" == "${value}" ]; then
  27.             echo "y"
  28.             return 0
  29.         fi
  30.     }
  31.     echo "n"
  32.     return 1
  33. }
  34. rm -f /tmp/sitemonitor.status.tmp
  35. for HOST in "${HOSTS[@]}"
  36. do
  37.     START=$(date +%s)
  38.     RESPONSE=`wget $HOST --no-check-certificate -S -q -O - 2>&1 | \
  39.                   awk '/^  HTTP/{print \$2}'`
  40.     END=$(date +%s)
  41.     DIFF=$(( $END - $START ))
  42.     if [ -z "$RESPONSE" ]; then
  43.         RESPONSE="0"
  44.     fi
  45.     if [ $(contains "${OK_STATUSES[@]}" "$RESPONSE") == "y" ]; then
  46.         if [ "$DIFF" -lt "$SLOW_THRESHOLD" ]; then
  47.             STATUS="UP"
  48.         else
  49.             STATUS="SLOW"
  50.         fi
  51.     else
  52.         STATUS="DOWN"
  53.     fi
  54.     touch $STATUS_FILE
  55.     STATUS_LINE=`grep $HOST $STATUS_FILE`
  56.     STATUS_PARTS=($(echo $STATUS_LINE | tr " " "\n"))
  57.     CHANGED=${STATUS_PARTS[2]}
  58.     if [ "$STATUS" != "${STATUS_PARTS[5]}" ]; then
  59.         #if [ -e "${STATUS_PARTS[5]}" ] || [ "$STATUS" != "UP" ]; then
  60.             if [ -z "${STATUS_PARTS[5]}" ]; then
  61.                 STATUS_PARTS[5]="No record"
  62.             fi
  63.             TIME=`date -d @$END`
  64.             echo "Time: $TIME" > /tmp/sitemonitor.email.tmp
  65.             echo "Host: $HOST" >> /tmp/sitemonitor.email.tmp
  66.             echo "Status: $STATUS" >> /tmp/sitemonitor.email.tmp
  67.             echo "Latency: $DIFF sec" >> /tmp/sitemonitor.email.tmp
  68.             echo "Previous status: ${STATUS_PARTS[5]}" >> /tmp/sitemonitor.email.tmp
  69.             if [ -z "${STATUS_PARTS[2]}" ]; then
  70.                 TIME="No record"
  71.             else
  72.                 TIME=`date -d @${STATUS_PARTS[2]}`
  73.             fi
  74.             echo "Previous change: $TIME" >> /tmp/sitemonitor.email.tmp
  75.             `mail -a "From: $NOTIFY_FROM_EMAIL" \
  76.                   -s "SiteMonitor Notification: $HOST is $STATUS" \
  77.                   "$NOTIFY_TO_EMAIL" < /tmp/sitemonitor.email.tmp`
  78.             rm -f /tmp/sitemonitor.email.tmp
  79.         #else
  80.              # first report, but host is up, so no need to notify
  81.         #fi
  82.         CHANGED="$END"
  83.     fi
  84.     echo $HOST $RESPONSE $CHANGED $END $DIFF $STATUS >> /tmp/sitemonitor.status.tmp
  85. done
复制代码

mv /tmp/sitemonitor.status.tmp $STATUS_FILE
异常提醒邮件的示例

view sourceprint?

Time: Fri Mar 23 17:20:02 UTC 2012

Host: http://www.example.com

Status: UP

Latency: 0 sec

Previous status: DOWN

Previous change: Fri Mar 23 15:05:20 UTC 2012

相当的简单,但工作的很好,你可以试试。
英文原文,OSCHINA原创翻译





您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-4 20:54 , Processed in 0.018998 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表