Предыстория
Есть у меня сайт 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
Который выполняет поставленную задачу. Его можно прописать в автозагрузку гнома, например, как у меня.



ноября 20, 2008 в 1:48 pm
А не проще проверять на самом сервере доступность задачей в кроне ps ax|grep mysql, если процесса нету рестартуем, также и с апачем. А правильней конечно же разобраться почему же он падает, может ресурсов не хватает и стоит задуматься о апгрейде.
ноября 21, 2008 в 11:59 am
Руслан Пилин, зачем публиковать такие банальные вещи ?????
Работать с CURL (или его аналогами) умеет подавляющее большинство даже начинающих программистов. Хотите поспорить - откройте любой учебник типа "...РНР (или еще что) для чайников..." и найдете описание работы с CURL
А для того чтобы прописать некоторую задачу в автозапуск вообще не надо знаний программиста, достаточно знаний пользователя
ноября 25, 2008 в 5:38 pm
Руся, тебе пора хостинг менять
декабря 5, 2008 в 8:27 pm
Mysql и Tomcat на серваке не падают... Само приложение перестает отвечать на запросы. Решение вопроса понятно - не хватает ресурсов. Хостинг тут не при чем. Заодно проверяется и вариант недоступности сервера из мира.
"Работать с CURL (или его аналогами) умеет подавляющее большинство даже начинающих программистов" - предлагаю провести опрос на эту тему среди студентов 5-го курса. Уверен, что 90% не в курсе того, что такое сиурл. Вместо критики, лучше напиши свою статью, которая была бы хоть кому-нибуть полезна.
декабря 6, 2008 в 11:53 am
«- предлагаю провести опрос на эту тему среди студентов 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. Элементарный сетевой (! и общечеловеческий !) этикет не позволяют тыкать
декабря 7, 2008 в 8:22 pm
ну может Руслан где-то абсолютно прав и иначе сделать никак не возможно
просто сами слова "Само приложение перестает отвечать на запросы" не вписываются в шану классическую РНР-шную парадигму. Для нас непонятна такая проблема.
Та что проблема, непонятно даже такое состояние скрипта. В Жаве, как видите, все обстоит иначе.
А по Курл то вы затеваете лишний холливар
декабря 10, 2008 в 12:36 am
Нормальная заметка. Работает.
Лучше использовать константу 'CHECK_INTERVAL' и для '--expire-time' когда 'Site is down'.
А с приложением надо разбираться.