Kiểm tra sức khỏe của trang web bằng cách sử dụng curl


34

Tôi muốn kiểm tra sức khỏe của một dịch vụ bằng cách gọi một url cụ thể trên đó. Cảm thấy như giải pháp đơn giản nhất là sử dụng cron để kiểm tra mỗi phút hoặc lâu hơn. Trong trường hợp có lỗi, cron gửi cho tôi một email.

Tôi đã thử sử dụng cUrl cho việc này nhưng tôi không thể đưa nó vào các thông báo đầu ra chỉ do lỗi. Nếu tôi cố gắng chuyển đầu ra thành / dev / null, nó sẽ in ra báo cáo tiến độ.

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

Tôi đã cố gắng xem qua các tùy chọn cuộn tròn nhưng tôi không thể tìm thấy bất cứ điều gì phù hợp với tình huống mà bạn muốn nó im lặng khi thành công nhưng lại gây ra tiếng ồn do lỗi.

Có cách nào để làm xoăn làm những gì tôi muốn hoặc có một số công cụ khác tôi nên xem xét không?


2
Làm thế nào về việc sử dụng icingahoặc bất kỳ hệ thống giám sát khác?
Stéphane Chazelas

Tôi đang sử dụng điều này trong một dự án sở thích với nguồn lực hạn chế trên một máy chủ được chia sẻ. Tôi rất thích sử dụng một hệ thống giám sát khác. Dù sao cũng cảm ơn vì tiền boa, tôi chưa nghe nói về icinga
palto

Tôi muốn chỉ ra rằng các nhà cung cấp dịch vụ lưu trữ chia sẻ sẽ cau mày về điều này nếu bạn thường xuyên truy cập tất cả các trang trên tài khoản của mình. Các nhà cung cấp thường có giới hạn quy trình đồng thời và giới hạn thời gian thực hiện tối đa. Ngoài ra phương pháp này sẽ không chính xác nếu có sự cố mất mạng giữa bạn và DC của nhà cung cấp. Bạn nên điều tra nhật ký truy cập tên miền trên tài khoản được chia sẻ của bạn. Thông thường có rất nhiều lưu lượng truy cập từ bot và chỉ có khách truy cập ngẫu nhiên sẽ cung cấp cho bạn một ý tưởng rất tốt về mức độ sẵn có của trang web của bạn.
RCjohnson

Câu trả lời:


39

Thế còn -sSf? Từ trang người đàn ông:

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

Ví dụ:

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

3
-SS không xuất ra thông báo lỗi vì một số lý do. Tôi cũng phải thêm -f. Các lệnh làm việc chính xác dường như là curl -fsS http://example.org > /dev/null. Điều đó sẽ không xuất ra bất cứ điều gì khi không có gì sai nhưng nó sẽ in mã trạng thái về các lỗi mà tôi thấy ổn.
palto

1
Ok, thêm vào -fđể tham khảo trong tương lai.
ahilsend

10

Tôi nghĩ rằng để cách đơn giản nhất để kiểm tra xem trang web còn sống hay không, bạn có thể sử dụng phương pháp sau:

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

Điều này sẽ trở lại HTTP/1.1 200 OK. Nếu lợi nhuận không khớp với đầu ra của bạn thì hãy gọi trợ giúp.


1
Kiểm tra mã trạng thái có thể có ý nghĩa hơn như các đề xuất khác
Dukeatcoding

Tôi nhận được "Tìm thấy HTTP / 1.1 302".
Đồng chí bọt biển

1
Điều này thật tuyệt vời vì nó vượt ra ngoài một ping cho phép tôi kiểm tra xem trang web của tôi có đang tải đúng không (kết nối với myQuery, v.v.) và nhận được kết quả có ý nghĩa hơn.
Nathan

8

Bạn cần -scờ (im lặng), -fcờ (không thành công với mã thoát lỗi) và có thể sử dụng -ocờ để chuyển hướng đầu ra:

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

Đây chỉ là một ví dụ tồi cho một kịch bản cron đơn giản. Thông thường, bạn chỉ muốn nhận một thư nếu trang web bị sập.


8

bạn có thể nắm bắt các số liệu thống kê thời gian mạng từ curl. độ trễ của từng pha trong chu kỳ yêu cầu / phản hồi có thể hữu ích để xác định sức khỏe.

$ 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

Cách này sẽ giúp bạn khi thử kiểm tra trang web khi có 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

Gần đây tôi đã được yêu cầu đưa ra một cái gì đó sẽ hoạt động giống như một nhịp tim phức tạp.

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

Hoặc, mở rộng để dễ đọc hơn một chút,

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

Những gì tôi đã làm là curlmột trang web, phân tích tất cả các liên kết từ html và sau đó là curlcác liên kết được phân tích cú pháp, chỉ xuất ra mã trạng thái. Sau đó, tôi sẽ tìm kiếm mã trạng thái http> = 400 để tìm lỗi.


1

Câu trả lời:

#!/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))"

Giải thích:

  • timeout 3ssẽ đặt thời gian chờ 3 giây cho yêu cầu của bạn. Trả lời chậm hơn được cho là "không lành mạnh"
  • cuộn tròn -fcờ sẽ thất bại sớm, -Ssẽ hiển thị lỗi, -ssẽ triệt tiêu đầu ra bình thường, -Isẽ chỉ tìm nạp các tiêu đề HTTP, không phải nội dung. (Như mọi khi, nhiều chi tiết có sẵn trên man curllệnh.)
  • -checkendchỉ thị openssl kiểm tra ngày hết hạn cho một chứng chỉ. Trong ví dụ của tôi, đó là 20 ngày (được chỉ định bằng giây).

Tôi nghĩ rằng bạn có lời giải thích -s-Shoán đổi
nafg

1

Curl có mã trạng thái thoát rất cụ thể
Tại sao không kiểm tra chúng?

#!/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}"

Sử dụng:

$ site-status.sh example.com

Kết quả:

$ example.com is online

Ghi chú:

Kịch bản này chỉ kiểm tra nếu trang web có thể được giải quyết.

Mã này sẽ giúp bạn có được nếu tất cả những gì bạn quan tâm là trang web đang lên hoặc xuống.
Tuy nhiên, nếu bạn thực hiện một vài thay đổi đối với khối if / khác, bạn có thể dễ dàng kiểm tra các mã trạng thái khác nếu muốn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.