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