我觉得我错过了显而易见的事,但没有成功man [curl|wget]
或谷歌(“http”这么糟糕的搜索词)。我正在寻找一个经常出现故障的网络服务器的快速和彻底修复,返回状态代码500并显示错误消息。一旦发生这种情况,就需要重新启动。
由于根本原因似乎很难找到,我们的目标是快速修复,希望能够缩短时间,直到我们能够真正解决它(服务不需要高可用性)< / p>
建议的解决方案是创建一个每5分钟运行一次的cron作业,检查http://localhost:8080/。如果返回状态码500,则将重新启动Web服务器。服务器将在一分钟内重新启动,因此无需检查已经运行的重启。
有问题的服务器是一个ubuntu 8.04最小安装,只安装了足够的软件包来运行它当前需要的软件包。在bash中执行任务没有硬性要求,但我希望它能在如此简单的环境中运行,而无需安装任何解释器。
(我非常熟悉脚本,将http状态代码分配给环境变量的命令/选项就足够了 - 这就是我所寻找和找不到的。)
答案 0 :(得分:268)
我没有在500代码上对此进行测试,但它适用于200,302和404等其他代码。
response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
根据@ibai的建议,添加--head
以制作仅限HEAD的请求。这将节省检索成功的时间,因为页面内容将不会被传输。
答案 1 :(得分:36)
curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"
的工作原理。如果没有,你必须点击返回查看代码本身。
答案 2 :(得分:16)
我今天需要快速演示一些东西然后想出来。如果有人需要类似于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发送每个状态变化的电子邮件警报,因此它是愚蠢的,可能是贪婪的。为了改进这一点,我将查看循环几个状态代码并根据结果执行不同的操作。
答案 3 :(得分:13)
虽然accepted response是一个很好的答案,但它忽略了失败的情况。如果请求中存在错误或连接失败,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
答案 4 :(得分:9)
使用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
答案 5 :(得分:8)
要遵循3XX重定向并打印所有请求的响应代码:
HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";
echo "${HTTP_STATUS}";
答案 6 :(得分:2)
另一种变化:
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-)
答案 7 :(得分:2)
这是我的实现,比以前的一些答案更详细
curl https://somewhere.com/somepath \
--silent \
--insecure \
--request POST \
--header "your-curl-may-want-a-header" \
--data @my.input.file \
--output site.output \
--write-out %{http_code} \
> http.response.code 2> error.messages
errorLevel=$?
httpResponse=$(cat http.response.code)
jq --raw-output 'keys | @csv' site.output | sed 's/"//g' > return.keys
hasErrors=`grep --quiet --invert errors return.keys;echo $?`
if [[ $errorLevel -gt 0 ]] || [[ $hasErrors -gt 0 ]] || [[ "$httpResponse" != "200" ]]; then
echo -e "Error POSTing https://somewhere.com/somepath with input my.input (errorLevel $errorLevel, http response code $httpResponse)" >> error.messages
send_exit_message # external function to send error.messages to whoever.
fi
答案 8 :(得分:1)
这可以帮助评估http状态
var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var
答案 9 :(得分:1)
这是一个冗长但易于理解的脚本,受到nicerobot解决方案的启发,它只请求响应标头并避免使用建议{I} here的IFS。当遇到响应&gt; = 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"
答案 10 :(得分:0)
要添加到上面的@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
答案 11 :(得分:0)
我不喜欢将数据与状态混合在一起的答案。 发现了这个: 您添加-f标志以使curl失败并从标准状态var中获取错误状态代码:$?
https://unix.stackexchange.com/questions/204762/return-code-for-curl-used-in-a-command-substitution
我不知道这里是否适合每种情况,但这似乎可以满足我的需求,我认为使用它要容易得多
答案 12 :(得分:0)
httpStatusCode=$(curl -s -o /dev/null -w "%{http_code}" https://{your_url}/) 如果 [ $httpStatusCode = 502 ];然后 sh /{path_to_folder}/stopscript.sh sh /{path_to_folder}/startscript.sh fi
*/5 * * * * /{path_to_folder}/checkBootAndRestart.sh