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

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

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

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

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


当前回答

我今天需要快速演示一些东西,于是想到了这个。我想如果有人需要类似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个状态变化时发送一封电子邮件提醒,所以它是愚蠢的和潜在的贪婪。为了改进这一点,我将考虑遍历几个状态代码,并根据结果执行不同的操作。

其他回答

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

虽然接受的响应是一个很好的答案,但它忽略了失败场景。如果请求中有错误或连接失败,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

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

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

补充一下@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

curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"

的工作原理。如果没有,则必须按回车键查看代码本身。