Как оценить коды ответа http из сценария bash/shell?
У меня такое чувство, что я упускаю очевидное, но не преуспел с man [curl|wget] или google ("http" делает такой плохой поисковый запрос). Я ищу быстрое и грязное исправление для одного из наших веб-серверов, который часто терпит неудачу, возвращая код состояния 500 с сообщением об ошибке. Как только это произойдет, он должен быть перезапущен.
поскольку первопричину, похоже, трудно найти, мы стремимся к быстрому исправлению, надеясь, что этого будет достаточно, чтобы преодолеть время, пока мы действительно не сможем это исправить (the сервис не нуждается в высокой доступности)
предлагаемое решение заключается в создании задания cron, которое выполняется каждые 5 минут, проверяя http://localhost:8080/. Если возвращается код состояния 500, сервер будет перезапущен. Сервер перезагрузится менее чем за минуту, поэтому нет необходимости проверять наличие уже запущенных перезапусков.
рассматриваемый сервер-это минимальная установка ubuntu 8.04 с достаточным количеством установленных пакетов для запуска того, что ему сейчас нужно. Нет жесткого требования для выполнения задачи в bash, но я бы хотел, чтобы она выполнялась в такой минимальной среде без установки дополнительных интерпретаторов.
(Я достаточно хорошо знаком со скриптами, что команда/параметры для присвоения кода состояния HTTP переменной среды будет достаточно - это то, что я искал и не мог найти.)
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