Предыстория

Есть у меня сайт http://snimayukvarti.ru, доступность которого достаточна важна для его пользователей. Как обычно бывает с нужными сайтами, он стал периодически падать. При этом востанавливается в худшем случае перезапуском MySQL и веб-сервера, в лучшем только веб-сервера. Причина падений, в принципе, понятна, но на ее решение требуется некоторое время, которого обычно нет. Проще потратить пару раз в неделю несколько минут на перезапуск серверов. Таким образом возникла задача, как можно быстрее узнавать о том, что сайт в данный момент недоступен.

Задача

Периодически проверять доступность сайт и показывать уведомление.

Решение

В фоновом режиме посылать на сервер HTTP HEAD запрос. Если сервер прислал статус 200 OK, вывести сообщение, что все ок. Если сервер лежит (статус отличный от 200), вывести сообщение о том, что сайт лежит, и не прятать его, пока не будет принято решение. Для этого первым делом я установил curl. Это программа, которая умеет формировать нужный мне запрос. Потом установил notify-send.


# aptitude install curl
# aptitude install libnotify-bin

Далее написал баш-скрипт:

#!/bin/bash

URL=$1
CHECK_INTERVAL=2m

while [ -n TRUE ]; do
    STATUS_CODE=`curl --head --silent $URL | head --lines=1`
    STATUS=`echo $STATUS_CODE | egrep "HTTP/[0-9]+.[0-9]+ 200"`

    if [ -n "$STATUS" ]; then
	 notify-send --expire-time=2000 --urgency=low "Site is up. :)" "$URL"
    fi

    if [ -z "$STATUS" ]; then
	 notify-send --expire-time=120000 --urgency=critical "Site is down :(" "$STATUS_CODE $URL"
    fi
    sleep $CHECK_INTERVAL
done

Который выполняет поставленную задачу. Его можно прописать в автозагрузку гнома, например, как у меня.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
* * *     5 голосов

7 Комментариев на “Мониторинг доступности сайта (Ubuntu 8.x)”

  1. jt сказал:

    А не проще проверять на самом сервере доступность задачей в кроне ps ax|grep mysql, если процесса нету рестартуем, также и с апачем. А правильней конечно же разобраться почему же он падает, может ресурсов не хватает и стоит задуматься о апгрейде.

  2. developerxyx сказал:

    Руслан Пилин, зачем публиковать такие банальные вещи ?????

    Работать с CURL (или его аналогами) умеет подавляющее большинство даже начинающих программистов. Хотите поспорить - откройте любой учебник типа "...РНР (или еще что) для чайников..." и найдете описание работы с CURL :)

    А для того чтобы прописать некоторую задачу в автозапуск вообще не надо знаний программиста, достаточно знаний пользователя

  3. Rayan сказал:

    Руся, тебе пора хостинг менять

  4. Руслан Пилин сказал:

    Mysql и Tomcat на серваке не падают... Само приложение перестает отвечать на запросы. Решение вопроса понятно - не хватает ресурсов. Хостинг тут не при чем. Заодно проверяется и вариант недоступности сервера из мира.

    "Работать с CURL (или его аналогами) умеет подавляющее большинство даже начинающих программистов" - предлагаю провести опрос на эту тему среди студентов 5-го курса. Уверен, что 90% не в курсе того, что такое сиурл. Вместо критики, лучше напиши свою статью, которая была бы хоть кому-нибуть полезна.

  5. developerxyx сказал:

    «- предлагаю провести опрос на эту тему среди студентов 5-го курса. Уверен, что 90% не в курсе того, что такое сиурл.»:
    Возможно, что 90% студентов и не знают что такое CURL. Но у всех студентов-программистов преподаются предметы «Компьютерные сети» и «WEB-технологии», а в рамках этих предметов обязательно (!) преподаются протоколы TCP/IP и HTTP. То есть практически любой студент может написать свой аналог CURL :).
    Спорить с этим тяжело, так как это зафиксировано в учебных планах и методичках соответствующих дисциплин :)

    Зайдем с другой стороны. Возможно, что 90% студентов и не знают что такое CURL. Но, уверен, что более 70% из них использовали (или слышали) про аналоги CURL:
    1. COM-компонент WebBrowser.
    2. средства .NET по работе с HTTP.
    3. QHttp (класс из стандартной поставки QT).
    4. средства Java по работе с HTTP.
    5. встроенная в Windows библиотека WinHttp .
    6. средства Delphi (С Builder) по работе с HTTP.
    7. UltraHTTP из пакета разработчика для Mac Os X.
    8. GTK HTTP extension.
    9. утилита WGET, встроенная в большинство дистрибутивов Linux.
    10 средства Flash по работе с HTTP.
    ….и так далее…..

    P.S. Элементарный сетевой (! и общечеловеческий !) этикет не позволяют тыкать :(

  6. Rayan сказал:

    ну может Руслан где-то абсолютно прав и иначе сделать никак не возможно

    просто сами слова "Само приложение перестает отвечать на запросы" не вписываются в шану классическую РНР-шную парадигму. Для нас непонятна такая проблема.

    Та что проблема, непонятно даже такое состояние скрипта. В Жаве, как видите, все обстоит иначе.

    А по Курл то вы затеваете лишний холливар

  7. Zavizionov сказал:

    Нормальная заметка. Работает.
    Лучше использовать константу 'CHECK_INTERVAL' и для '--expire-time' когда 'Site is down'.

    А с приложением надо разбираться.





Оставте свое мнение