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

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

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

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

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


当前回答

下面是我的实现,它比以前的一些答案更详细一些

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

其他回答

这可以帮助评估HTTP状态

var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var

假设您已经为应用程序实现了一个停止和启动脚本。创建一个如下所示的脚本,检查应用程序url的http状态,并在出现502时重新启动:

httpStatusCode=$(curl -s -o /dev/null -w "%{http_code}" https://{your_url}/) if [$httpStatusCode = 502];然后执行sh /{path_to_folder}/stopscript.sh sh /{path_to_folder}/startscript.sh fi .sh

实现一个cron作业,每5分钟调用一次这个脚本。假设上面的脚本名为checkBootAndRestart.sh。那么你的crontab应该看起来像- */5 * * * */ {path_to_folder}/checkBootAndRestart.sh

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

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

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

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

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

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