Как оценить коды ответа http из сценария bash/shell?



У меня такое чувство, что я упускаю очевидное, но не преуспел с man [curl|wget] или google ("http" делает такой плохой поисковый запрос). Я ищу быстрое и грязное исправление для одного из наших веб-серверов, который часто терпит неудачу, возвращая код состояния 500 с сообщением об ошибке. Как только это произойдет, он должен быть перезапущен.



поскольку первопричину, похоже, трудно найти, мы стремимся к быстрому исправлению, надеясь, что этого будет достаточно, чтобы преодолеть время, пока мы действительно не сможем это исправить (the сервис не нуждается в высокой доступности)



предлагаемое решение заключается в создании задания cron, которое выполняется каждые 5 минут, проверяя http://localhost:8080/. Если возвращается код состояния 500, сервер будет перезапущен. Сервер перезагрузится менее чем за минуту, поэтому нет необходимости проверять наличие уже запущенных перезапусков.



рассматриваемый сервер-это минимальная установка ubuntu 8.04 с достаточным количеством установленных пакетов для запуска того, что ему сейчас нужно. Нет жесткого требования для выполнения задачи в bash, но я бы хотел, чтобы она выполнялась в такой минимальной среде без установки дополнительных интерпретаторов.



(Я достаточно хорошо знаком со скриптами, что команда/параметры для присвоения кода состояния HTTP переменной среды будет достаточно - это то, что я искал и не мог найти.)

740   10  

10 ответов:

Я не тестировал это на коде 500, но он работает на других, таких как 200, 302 и 404.

response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"

строительство. Если нет, вы должны нажать return, чтобы просмотреть сам код.

здесь:

url='http://localhost:8080/'
status=$(r=(IFS=' ';$(curl -Is --connect-timeout 5 "${url}" || echo 1 500));echo ${r[1]})
[ status -eq 500 ] && bounce # assuming the bounce script is called 'bounce'

или поставить все это в одну строку:

[ 500 -eq $(r=(IFS=' ';$(curl -Is --connect-timeout 5 'http://localhost:8080/' || echo 1 500));echo ${r[1]}) ] && bounce

чтобы объяснить, HTTP-ответ всегда содержит статус сервера как часть первой строки ответа, например:

HTTP/1.1 200 OK
HTTP/1.0 404 NOT FOUND

скрипт просто использует curl для выполнения запроса головы на localhost: 8080. Он преобразует заголовок HTTP в массив и возвращает второй элемент. Чтобы упростить обработку некоторых сбоев, если головка не подключается в течение 5 секунд или по какой-то причине завиток не работает, 500 также возвращенный.

Мне нужно что-то быстро демо сегодня и придумал это. Подумал, что я бы разместил его здесь, если кому-то нужно что-то похожее на запрос OP.

#!/bin/bash

status_code=$(curl --write-out %{http_code} --silent --output /dev/null www.bbc.co.uk/news)

if [[ "$status_code" -ne 200 ]] ; then
  echo "Site status changed to $status_code" | mail -s "SITE STATUS CHECKER" "[email protected]" -r "STATUS_CHECKER"
else
  exit 0
fi

Это отправит уведомление по электронной почте о каждом изменении состояния от 200, так что это глупо и потенциально жадно. Чтобы улучшить это, я бы посмотрел на цикл через несколько кодов состояния и выполнение различных действий в зависимости от результата.

С netcat и awk вы можете обрабатывать ответ сервера вручную:

if netcat 127.0.0.1 8080 <<EOF | awk 'NR==1{if ( == "500") exit 0; exit 1;}'; then
GET / HTTP/1.1
Host: www.example.com

EOF

    apache2ctl restart;
fi

чтобы следовать 3xx перенаправляет и печатать коды ответов для всех запросов:

HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
echo "${HTTP_STATUS}";

это может помочь оценить состояние http

var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print }'`
echo http:$var

здесь идет многословный – но простой для понимания-скрипт, вдохновленный решением nicerobot, который запрашивает только заголовки ответов и избегает использования IFS, как предложено здесь. Он выводит сообщение об отказе, когда он встречает ответ >= 400. Это эхо может быть заменено на bounce-скрипт.

# set the url to probe
url='http://localhost:8080'
# use curl to request headers (return sensitive default on timeout: "timeout 500"). Parse the result into an array (avoid settings IFS, instead use read)
read -ra result <<< $(curl -Is --connect-timeout 5 "${url}" || echo "timeout 500")
# status code is second element of array "result"
status=${result[1]}
# if status code is greater than or equal to 400, then output a bounce message (replace this with any bounce script you like)
[ $status -ge 400  ] && echo "bounce at $url with status $status"

еще один вариант:

status=$(curl -I https://www.healthdata.gov/user/login 2> /dev/null | head -n 1 | cut -d ' ' -f 2)

чтобы добавить к комментарию @DennisWilliamson выше:

@VaibhavBajpai: попробуйте это: response=$(curl --write-out \n%{http_code} --silent --output - servername) - последняя строка в результате будет код ответа

затем вы можете проанализировать код ответа из ответа, используя что-то вроде следующего, где X может обозначать регулярное выражение для обозначения конца ответа (используя пример json здесь)

X='*\}'
code=$(echo ${response##$X})

См. Удаление Подстроки: http://tldp.org/LDP/abs/html/string-manipulation.html

Comments

    Ничего не найдено.