การตรวจสุขภาพของเว็บเพจโดยใช้ 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

ฉันลองดูตัวเลือกการม้วน แต่ฉันไม่สามารถหาอะไรให้เหมาะกับสถานการณ์ที่คุณต้องการให้มันเงียบในความสำเร็จ แต่ทำเสียงดังจากข้อผิดพลาด

มีวิธีทำให้ขดทำในสิ่งที่ฉันต้องการหรือมีเครื่องมืออื่นที่ฉันควรจะดูหรือไม่?


2
วิธีการเกี่ยวกับการใช้icingaหรือระบบการตรวจสอบอื่น ๆ ?
Stéphane Chazelas

ฉันใช้สิ่งนี้ในโครงการงานอดิเรกที่มีทรัพยากร จำกัด บนโฮสต์ที่ใช้ร่วมกัน ฉันชอบที่จะใช้ระบบการตรวจสอบเป็นอย่างอื่น ขอบคุณสำหรับเคล็ดลับอย่างไรก็ตามฉันไม่เคยได้ยินของ icinga มาก่อน
palto

ฉันต้องการจะชี้ให้เห็นว่าผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันจะขมวดคิ้วในเรื่องนี้หากคุณกดปุ่มเพจทั้งหมดในบัญชีของคุณบ่อยเกินไป ผู้ให้บริการมักจะมีข้อ จำกัด กระบวนการที่เกิดขึ้นพร้อมกันและการ จำกัด เวลาในการดำเนินการสูงสุด นอกจากนี้วิธีนี้จะไม่ถูกต้องหากมีการหยุดทำงานของเครือข่ายระหว่างคุณและ DC ของผู้ให้บริการ คุณควรตรวจสอบบันทึกการเข้าถึงโดเมนในบัญชีที่ใช้ร่วมกันของคุณ โดยทั่วไปจะมีปริมาณการใช้ข้อมูลจากบอทและมีเพียงผู้เยี่ยมชมสุ่มเท่านั้นที่จะทำให้คุณมีความคิดที่ดีว่าเว็บไซต์ของคุณมีให้ใช้งานอย่างไร
rcjohnson

คำตอบ:


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
การตรวจสอบรหัสสถานะอาจดูสมเหตุสมผลกว่าข้อเสนออื่น ๆ
Dukeatcoding

ฉันได้รับ "HTTP / 1.1 302 พบ"
ฟองน้ำสหาย

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

คุณสามารถจับภาพสถิติเวลาเครือข่ายจากขด เวลาแฝงของแต่ละเฟสในรอบคำขอ / การตอบกลับจะเป็นประโยชน์ในการพิจารณาความสมบูรณ์

$ 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นั้นแยกวิเคราะห์ลิงก์เหล่านั้นโดยแสดงเฉพาะรหัสสถานะ จากนั้นฉันจะค้นหารหัสสถานะ http> = 400 เพื่อค้นหาข้อผิดพลาด


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 วินาทีสำหรับคำขอของคุณ การตอบรับช้ากว่าจะได้รับการยินยอมให้เป็น
  • การ-fตั้งค่าสถานะcurl จะล้มเหลวก่อน-Sจะแสดงข้อผิดพลาด-sจะระงับผลลัพธ์ปกติ-Iจะดึงเฉพาะส่วนหัว HTTP ไม่ใช่เนื้อหา (เช่นเคยมีรายละเอียดเพิ่มเติมตามman curlคำสั่ง)
  • openssl -checkenddirective ตรวจสอบวันหมดอายุของใบรับรอง ในตัวอย่างของฉันมันคือ 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 คุณสามารถทดสอบรหัสสถานะอื่นได้อย่างง่ายดายหากคุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.