我有我缺少明显的感觉,但没有成功与man [curl|wget]
或谷歌(“HTTP”,使这种恶劣的检索词)。 我在寻找一个快速和肮脏的修复我们的网络服务器经常失败的一个,返回状态代码500的错误消息。 一旦发生这种情况,就需要重新启动。
由于根本原因似乎很难找到,我们的目标速战速决,希望这将足以弥补时间,直到我们真的可以修复它(该服务并不需要高可用性)
所提出的解决方案是创建一个运行每5分钟,检查cron作业的http://本地主机:8080 / 。 如果有状态码500返回,Web服务器将重新启动。 该服务器将重新启动在一分钟之内,因此没有需要检查的重新启动已在运行。
有问题的服务器是Ubuntu的8.04最小安装安装到运行它当前需要只够包。 没有硬性要求做在bash的任务,但我想它在这样一个最小的环境,而无需安装任何更多的口译运行。
(我足够熟悉脚本的命令/选项的HTTP状态代码分配给一个环境变量就足够了 - 这是我一直寻找,但没有找到。)
Answer 1:
我还没有500码测试这一点,但它也适用于其他像200,302和404。
response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
正如@ibai建议,加--head
做出HEAD唯一的要求。 当检索是成功的,因为页面的内容不会被传输,这将节省时间。
Answer 2:
curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"
作品。 如果没有,你打回查看代码本身。
Answer 3:
我需要快速的今天演示的东西,这个走了过来。 我以为我会在这里把它,如果有人需要类似于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" "my_email@email.com" -r "STATUS_CHECKER"
else
exit 0
fi
这会从200每一个状态变化发送电子邮件警报,所以它的愚蠢和贪婪的可能。 为了改善这一点,我想看看经过几个状态代码循环和执行依赖于结果不同的动作。
Answer 4:
虽然接受响应是一个很好的答案,它忽略的故障情况。 curl
会返回000
,如果在该请求的错误或有连接失败。
url='http://localhost:8080/'
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # do start/restart logic
注意:这正好有点出乎所要求的500
状态检查也证实, curl
,甚至可以连接到服务器(即返回000
)。
创建一个从它的功能:
failureCode() {
local url=${1:-http://localhost:8080}
local code=${2:-500}
local status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
[[ $status == ${code} ]] || [[ $status == 000 ]]
}
测试得到一个500
:
failureCode http://httpbin.org/status/500 && echo need to restart
测试得到错误/连接失败(即000
):
failureCode http://localhost:77777 && echo need to start
试验没有得到500
:
failureCode http://httpbin.org/status/400 || echo not a failure
Answer 5:
随着netcat的和awk可以手动处理服务器响应:
if netcat 127.0.0.1 8080 <<EOF | awk 'NR==1{if ($2 == "500") exit 0; exit 1;}'; then
GET / HTTP/1.1
Host: www.example.com
EOF
apache2ctl restart;
fi
Answer 6:
要遵循3XX重定向,并为所有请求打印响应代码:
HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";
echo "${HTTP_STATUS}";
Answer 7:
另一个变化:
status=$(curl -sS -I https://www.healthdata.gov/user/login 2> /dev/null | head -n 1 | cut -d' ' -f2)
status_w_desc=$(curl -sS -I https://www.healthdata.gov/user/login 2> /dev/null | head -n 1 | cut -d' ' -f2-)
Answer 8:
这可以帮助评估HTTP状态
var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var
Answer 9:
这里谈到的啰嗦-但很容易理解-脚本,通过该解决方案的启发nicerobot ,只请求响应报头,并使用IFS的建议避免了这里 。 它输出,当它遇到的响应的退回邮件> = 400。该回声可以用可弹脚本替换。
# 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"
Answer 10:
要添加到上面@DennisWilliamson评论:
@VaibhavBajpai:尝试这样的:响应= $(卷曲--write出\ N%{HTTP_CODE} --silent --output - 服务器名) - 在结果中的最后一行将响应代码
然后,您可以分析使用类似于以下,其中X可以表示一个正则表达式来标记响应的结束的响应响应代码(使用JSON例子在这里)
X='*\}'
code=$(echo ${response##$X})
见子串删除: http://tldp.org/LDP/abs/html/string-manipulation.html
文章来源: How to evaluate http response codes from bash/shell script?