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

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

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

所讨论的服务器是ubuntu 8.04最小安装,只安装了足够运行当前所需的包。在bash中执行该任务没有硬性要求,但我希望它能在这样一个最小的环境中运行,而不需要安装任何解释器。

(我非常熟悉脚本,命令/选项将http状态代码分配给一个环境变量就足够了——这是我一直在寻找的,但没有找到。)


当前回答

补充一下@DennisWilliamson的评论:

@VaibhavBajpai:试试这个:response=$(curl——write-out \n%{http_code}——silent——output - servername) -结果中的最后一行将是响应代码

然后,您可以使用类似以下的代码从响应中解析响应代码,其中X可以表示一个regex,以标记响应的结束(此处使用json示例)

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

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

其他回答

我还没有在500代码上测试过,但它可以在200、302和404等其他代码上运行。

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

注意,——write-out提供的格式应该加引号。 根据@ibai的建议,添加——head来进行head请求。这将在检索成功时节省时间,因为页面内容不会被传输。

另一个变化:

       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-)

使用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

我不喜欢这里把数据和状态混合在一起的答案。 发现了这个: 添加-f标志使curl失败,并从标准状态变量$?

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

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

这里有一个冗长但容易理解的脚本,灵感来自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"