Назад | Перейти на главную страницу

Bash-скрипт для проверки состояния удаленного веб-сервера

У меня есть пара устройств с веб-интерфейсами, состояние которых мне нужно регулярно проверять.

Сервер считается работающим (исправным), если он возвращает код состояния http 1xx (продолжение), 2xx (успех) или 3xx (перенаправление). Он считается мертвым, если он возвращает коды 4xx (ошибка клиента) или 5xx (ошибка сервера) или если он не отвечает в заданное время.

Что касается получения кода статуса - я покрыл это:

curl -I http://server.domain

Как надежно определить тайм-аут (скажем, я считаю 5 секунд слишком большим, это достаточно времени, поскольку это происходит в локальной сети с небольшим трафиком или вообще без него) и убить процесс curl, если заданное время проходит, а ответа нет? Или еще лучше - как связать их, чтобы получить один сценарий, который возвращает TRUE, если сервер исправен, и FALSE, если сервер возвращает ошибки или время ожидания?

Я согласен со Свеном, что это проблема, для которой уже есть готовые решения.

Тем не менее, вы можете использовать код выхода, возвращаемый curl чтобы определить, произошел ли тайм-аут.

Вот сценарий, который возвращает FALSE, если время ожидания curl истекло или сервер возвращает код состояния 4xx или 5xx:

HEADERS=`curl -Is --connect-timeout ${1-5} http://server.domain/`
CURLSTATUS=$?

# Check for timeout
if [ $CURLSTATUS -eq 28 ]
    then
        echo FALSE
else
    # Check HTTP status code
    HTTPSTATUS=`echo $HEADERS | grep HTTP | cut -d' ' -f2`
    if [ $HTTPSTATUS -le 399 ]
        then
            echo TRUE
    else
        echo FALSE
    fi
fi

Этот сценарий принимает аргумент тайм-аута, но по умолчанию составляет 5 секунд. Я протестировал это на действующем URL с таймаутом соединения 5 секунд и таймаутом 0,01 секунды, чтобы продемонстрировать:

# sh check_website.sh 5
TRUE
# sh check_website.sh .01
FALSE