如何评估bash/shell脚本中的http响应代码?

Ola*_*ock 180 bash shell http http-headers

我有一种感觉,我错过了显而易见的,但没有成功man [curl|wget]或谷歌("http"做出如此糟糕的搜索词).我正在寻找一个快速和脏的修复我们的一个经常失败的网络服务器,返回状态代码500与错误消息.一旦发生这种情况,就需要重新启动它.

由于根本原因似乎很难找到,我们的目标是快速修复,希望它足以缩短时间,直到我们能够真正解决它(该服务不需要高可用性)

建议的解决方案是创建一个每5分钟运行一次的cron作业,检查http:// localhost:8080 /.如果返回状态码500,则将重新启动Web服务器.服务器将在一分钟内重启,因此无需检查已经运行的重启.

有问题的服务器是一个ubuntu 8.04最小安装,只安装了足够的软件包来运行它当前需要的软件包.在bash中执行任务没有硬性要求,但我希望它能在如此简单的环境中运行,而无需安装任何解释器.

(我非常熟悉脚本,将http状态代码分配给环境变量的命令/选项就足够了 - 这就是我所寻找和找不到的.)

Pau*_*ce. 284

我没有在500代码上测试过这个,但它适用于200,302和404等其他代码.

response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
Run Code Online (Sandbox Code Playgroud)

根据@ibai的建议,添加--head以制作仅HEAD请求.这将节省检索成功的时间,因为不会传输页面内容.

  • @VaibhavBajpai:试试这个:`response = $(curl --write-out \\n%{http_code} --silent --output - servername)` - 结果中的最后一行是响应代码. (6认同)
  • 我可以将响应代码和输出存储在单独的变量中吗?当响应代码不是200时,我想回显输出 (3认同)
  • 如果第一个请求的结果是3XX,则不显示最终请求状态.例如,如果返回的值是301重定向,那么此脚本就会停在那里.如果添加-IL,则可以获得最终状态.如果要显示所有请求的所有HTTP状态,请使用下面的示例. (2认同)
  • 工作得很好,谢谢!然而,就我而言(https),我还需要添加“--insecure”。 (2认同)
  • 您可以使用 -I 或 --head 只发出 HEAD 请求并避免下载整个主体,即使它是到 /dev/null 。在许多情况下,这可以大大减少执行时间。`response=$(curl --head --write-out %{http_code} --silent --output /dev/null 服务器名)` (2认同)

hd1*_*hd1 39

curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"
Run Code Online (Sandbox Code Playgroud)

作品.如果没有,你必须点击返回查看代码本身.


Chr*_*att 19

我今天需要快速演示一些东西然后想出来.如果有人需要类似于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
Run Code Online (Sandbox Code Playgroud)

这将从200发送每个状态变化的电子邮件警报,因此它是愚蠢的,可能是贪婪的.为了改善这一点,我将研究循环几个状态代码并根据结果执行不同的操作.


nic*_*bot 18

这里:

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
Run Code Online (Sandbox Code Playgroud)

或者把它全部放在一行:

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 ]]
}
Run Code Online (Sandbox Code Playgroud)

为了解释,HTTP响应始终包含服务器状态作为响应第一行的一部分,如:

failureCode http://httpbin.org/status/500 && echo need to restart
Run Code Online (Sandbox Code Playgroud)

该脚本只使用curl对localhost:8080执行HEAD请求.它将HTTP标头转换为数组并返回第二个元素.为简化某些故障处理,如果HEAD在5秒内无法连接或由于某种原因卷曲失败,则还会返回500.


mar*_*rco 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
Run Code Online (Sandbox Code Playgroud)


sil*_*tar 8

要遵循3XX重定向并打印所有请求的响应代码:

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

  • `grep` 将捕获所有带有“HTTP”的行。也许“grep -m 1 HTTP”只获取第一个匹配项(如果这是意图的话),或者可以通过管道传输到 Awk 来仅解析结果代码。 (2认同)

AG6*_*6HQ 6

这是我的实现,它比之前的一些答案更冗长

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
Run Code Online (Sandbox Code Playgroud)


nat*_*n g 5

我不喜欢这里将数据与状态混合在一起的答案。发现这一点:您添加 -f 标志以使curl失败并从标准状态变量中获取错误状态代码:$?

https://unix.stackexchange.com/questions/204762/return-code-for-curl-used-in-a-command-substitution

我不知道它是否适合这里的每个场景,但它似乎符合我的需求,而且我认为它更容易使用