代码之家  ›  专栏  ›  技术社区  ›  Olaf Kock

如何从bash/shell脚本评估HTTP响应代码?

  •  157
  • Olaf Kock  · 技术社区  · 14 年前

    我有种感觉,我错过了明显的,但没有成功 man [curl|wget] 或者谷歌(“http”是一个很糟糕的搜索词)。我正在寻找对我们的一个经常失败的Web服务器的快速修复,返回状态代码500并显示错误消息。一旦发生这种情况,就需要重新启动。

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

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

    所讨论的服务器是一个Ubuntu8.04最小安装,安装的软件包只够运行当前所需的软件包。在bash中完成这项任务没有什么困难的要求,但是我希望它在这样一个最小的环境中运行,而不需要安装更多的解释程序。

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

    10 回复  |  直到 5 年前
        1
  •  258
  •   Dennis Williamson    6 年前

    我还没有在500代码上测试过这个,但是它在其他代码上工作,比如200、302和404。

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

    如@ibai建议,添加 --head 提出一个仅限头部的请求。这将节省检索成功时的时间,因为不会传输页面内容。

        2
  •  35
  •   nathan gonzalez    12 年前
    curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"
    

    作品。如果没有,您必须点击返回来查看代码本身。

        3
  •  13
  •   nicerobot    14 年前

    在这里:

    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执行head请求。它将HTTP头转换为数组并返回第二个元素。为了简化一些故障处理,如果头在5秒内无法连接,或者由于某种原因卷曲失败,则返回500。

        4
  •  13
  •   Chris Gillatt    7 年前

    今天我需要快速演示一些东西,然后想到了这个。我想我会把它放在这里,如果有人需要类似于手术要求的东西。

    #!/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个州的每一个变化,所以它是愚蠢和潜在的贪婪。为了改进这一点,我将研究通过几个状态代码循环,并根据结果执行不同的操作。

        5
  •  9
  •   marco    14 年前

    通过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
    
        6
  •  8
  •   siliconrockstar    9 年前

    要遵循3xx重定向并打印所有请求的响应代码,请执行以下操作:

    HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
    echo "${HTTP_STATUS}";
    
        7
  •  2
  •   Nam G VU    5 年前

    另一个变化:

           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-)
    
        8
  •  1
  •   Tunaki user5979544    9 年前

    这有助于评估HTTP状态

    var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
    echo http:$var
    
        9
  •  1
  •   Community Mike Kinghan    7 年前

    这是一个冗长而易懂的剧本,灵感来自于 nicerobot ,只请求响应头,避免按建议使用ifs here . 当它遇到响应>=400时,它会输出一条反弹消息。这个echo可以用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"
    
        10
  •  0
  •   user1015492    8 年前

    添加到@denniswilliamson评论:

    @vaibhavbajpai:尝试以下操作:response=$(curl--写出\n%http--静音--输出-服务器名称)-结果的最后一行将是响应代码

    然后,您可以使用下面这样的方法解析响应中的响应代码,其中x可以表示一个regex来标记响应的结束(这里使用一个JSON示例)。

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

    请参见子字符串删除: http://tldp.org/LDP/abs/html/string-manipulation.html