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

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

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

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

curl -I http://server.domain

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

1 ответ

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

Тем не менее, вы можете использовать код выхода, возвращенный 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
Другие вопросы по тегам