使用curl对网页进行健康检查


34

我想通过在服务上调用特定的URL来对其进行运行状况检查。感觉最简单的解决方案是每分钟左右使用cron进行检查。万一发生错误,cron会给我发送电子邮件。

我尝试为此使用cUrl,但是我无法让它仅在出现错误时输出消息。如果我尝试将输出定向到/ dev / null,它将打印进度报告。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5559  100  5559    0     0   100k      0 --:--:-- --:--:-- --:--:--  106k

我尝试浏览curl选项,但找不到任何适合您希望它对成功保持沉默但对错误造成干扰的情况。

有没有一种方法可以使卷曲达到我想要的效果,或者还有其他我应该关注的工具?


2
使用icinga或其他任何监视系统如何?
斯特凡Chazelas

我在共享主机上资源有限的业余项目中使用了此功能。我很想否则使用监视系统。无论如何,还是感谢小费,我之前从未听说过icinga
palto

我想指出的是,如果您太频繁地访问帐户中的所有页面,共享托管服务提供商将对此感到不满意。提供程序通常具有并发过程限制和最大执行时间限制。同样,如果您和提供商的DC之间存在网络中断,则此方法也不准确。您应该调查共享帐户上的域访问日志。通常,漫游器和随机访问者会产生大量流量,这将使您对网站的可用性有一个很好的了解。
rcjohnson

Answers:


39

-sSf呢 从手册页:

  -s/--silent
     Silent or quiet mode. Do not show progress meter or error messages.  
     Makes Curl mute.

  -S/--show-error
     When used with -s it makes curl show an error message if it fails.

  -f/--fail
     (HTTP)  Fail silently (no output at all) on server errors. This is mostly
     done to better enable scripts etc to better deal with failed attempts. In
     normal  cases  when a HTTP server fails to deliver a document, it returns
     an HTML document stating so (which often also describes  why  and  more).
     This flag will prevent curl from outputting that and return error 22.

     This method is not fail-safe and there are occasions where non-successful
     response codes will  slip  through,  especially  when  authentication  is
     involved (response codes 401 and 407).

例如:

curl -sSf http://example.org > /dev/null

3
-sS由于某种原因未输出错误消息。我还必须添加-f。正确的工作命令似乎是curl -fsS http://example.org > /dev/null。当没有任何问题时,它不会输出任何内容,但会在出现错误时输出状态代码,这对我来说很好。
palto

1
确定,添加-f以供将来参考。
ahilsend

10

我认为,对于检查站点是否存在的最简单方法,可以使用以下方法:

curl -Is http://www.google.com | head -n 1

这将返回HTTP/1.1 200 OK。如果返回的结果与您的输出不匹配,请寻求帮助。


1
检查状态码与其他建议
相比

我得到“ HTTP / 1.1 302 Found”。
海绵同志

1
这很棒,因为它不仅可以执行ping操作,还可以让我检查站点是否正确加载(连接到mySQL等),并获得更有意义的结果。
内森

8

您需要-s标志(无声),-f标志(错误,退出代码失败,并可以使用该-o标志重定向输出):

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" admin@thesite.com 

对于简单的cron脚本,这只是一个不好的例子。通常,如果网站关闭,您只希望收到一封邮件。


8

您可以从curl捕获网络时序统计信息。请求/响应周期中每个阶段的延迟对于确定运行状况可能很有用。

$ URL=https://example.com
$ curl "$URL" -s -o /dev/null -w \
> "response_code: %{http_code}\n
> dns_time: %{time_namelookup}
> connect_time: %{time_connect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}
> "
response_code: 200

dns_time: 0.029
connect_time: 0.046
pretransfer_time: 0.203
starttransfer_time: 0.212
total_time: 0.212

2

当存在https时,这种方法将在尝试测试站点时为您提供帮助:

#!/bin/bash
# put your domain in this var
https=https://www.somewebsite.com

# save the status in some variable 
status=`curl $https -k -s -f -o /dev/null && echo "SUCCESS" || echo "ERROR"`    

# print results (or use it in your scripts)
echo "testing $https=$status"

1

最近有人要求我提出一些更像是复杂的心跳的动作。

for i in `curl -s -L cnn.com |egrep --only-matching "http(s?):\/\/[^ \"\(\)\<\>]*" | uniq` ; do curl -s -I $i 2>/dev/null |head -n 1 | cut -d$' ' -f2; done

或者,进行扩展以提高可读性,

for i in $(curl -s -L cnn.com |egrep --only-matching 'http(s?):\/\/[^ \"\(\)\<\>]*' | uniq)
do
    curl -s -I "$i" 2>/dev/null | head -n 1 | cut -d' ' -f2
done

我所做的是curl一个网站,从html解析所有链接,然后curl解析那些链接,仅输出状态代码。然后,我将搜索> = 400的http状态代码以查找错误。


1

回答:

#!/bin/bash -eu
timeout 3s curl -fIsS http://example.org > /dev/null
# and if you have TLS (https), check if it's about to expire:
true | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -checkend "$((3600*24*20))"

说明:

  • timeout 3s将为您的请求设置3秒超时。回答较慢被认为是“不健康的”
  • curl -f标志将尽早失败,-S将显示错误,-s将抑制正常输出,-I仅获取HTTP标头,而不获取内容。(与往常一样,可在man curl命令中获取更多详细信息。)
  • openssl -checkend指令检查证书的到期日期。在我的示例中,为20天(以秒为单位)。

我认为您已经了解了-s-S交换了内容
nafg

1

Curl具有非常特定的退出状态代码,
为什么不检查这些代码呢?

#!/bin/bash

##name: site-status.sh

FAIL_CODE=6

check_status(){
    LRED="\033[1;31m" # Light Red
    LGREEN="\033[1;32m" # Light Green
    NC='\033[0m' # No Color


    curl -sf "${1}" > /dev/null

    if [ ! $? = ${FAIL_CODE} ];then
        echo -e "${LGREEN}${1} is online${NC}"
    else
        echo -e "${LRED}${1} is down${NC}"
    fi
}


check_status "${1}"

用法:

$ site-status.sh example.com

结果:

$ example.com is online

笔记:

该脚本仅检查网站是否可以解析。

如果您关心的只是站点是否正常运行,此代码应该可以帮助您。
但是,如果对if / else块进行了一些更改,则可以根据需要轻松地测试其他状态代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.