Pemeriksaan kesehatan halaman web menggunakan curl

34

Saya ingin melakukan pemeriksaan kesehatan suatu layanan dengan menghubungi url tertentu. Terasa seperti solusi paling sederhana adalah menggunakan cron untuk melakukan pemeriksaan setiap menit. Jika terjadi kesalahan, cron mengirimi saya email.

Saya mencoba menggunakan cUrl untuk ini, tetapi saya tidak bisa menampilkan pesan hanya pada kesalahan. Jika saya mencoba mengarahkan output ke / dev / null, itu akan mencetak laporan kemajuan.

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

Saya mencoba melihat melalui opsi curl tapi saya tidak bisa menemukan apa pun yang sesuai dengan situasi di mana Anda ingin diam pada kesuksesan tetapi membuat kebisingan pada kesalahan.

Apakah ada cara untuk membuat ikal melakukan apa yang saya inginkan atau ada alat lain yang harus saya perhatikan?

palto
sumber
2
Bagaimana dengan menggunakan icingaatau sistem pemantauan lainnya?
Stéphane Chazelas
Saya menggunakan ini pada proyek hobi dengan sumber daya terbatas pada host bersama. Saya akan senang menggunakan sistem pemantauan sebaliknya. Terima kasih atas tipnya, saya belum pernah mendengar icinga sebelumnya
palto
Saya ingin menunjukkan bahwa penyedia hosting berbagi akan menyukai ini jika Anda terlalu sering memukul semua halaman di akun Anda. Penyedia biasanya memiliki batas proses bersamaan dan batas waktu maks eksekutif. Metode ini juga tidak akan akurat jika ada pemadaman jaringan antara Anda dan DC penyedia. Anda harus menyelidiki log akses domain di akun bersama Anda. Biasanya ada banyak lalu lintas dari bot dan hanya pengunjung acak yang akan memberi Anda ide yang sangat baik tentang seberapa tersedia situs Anda.
rcjohnson

Jawaban:

39

Bagaimana dengan -sSf? Dari halaman manual:

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

Sebagai contoh:

curl -sSf http://example.org > /dev/null
ahilsend
sumber
3
-SS tidak menampilkan pesan kesalahan karena alasan tertentu. Saya harus menambahkan -f juga. Tampaknya perintah kerja yang benar curl -fsS http://example.org > /dev/null. Itu tidak akan menghasilkan apa-apa ketika tidak ada yang salah tetapi itu akan mencetak kode status pada kesalahan yang saya terima.
palto
1
Oke, ditambahkan -funtuk referensi di masa mendatang.
ahilsend
10

Saya pikir untuk cara paling sederhana untuk memeriksa apakah situs tersebut masih hidup, Anda dapat menggunakan metode berikut:

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

Ini akan kembali HTTP/1.1 200 OK. Jika pengembalian tidak sesuai dengan output Anda maka panggil bantuan.

Raza
sumber
1
Memeriksa kode status mungkin lebih masuk akal seperti proposal lainnya
Dukeatcoding
Saya mendapatkan "HTTP / 1.1 302 Ditemukan".
Sponge Kamerad
1
Ini bagus karena melampaui ping yang memungkinkan saya memeriksa untuk melihat apakah situs saya memuat dengan benar (koneksi ke mySQL dll.) Dan mendapatkan hasil yang lebih bermakna.
Nathan
8

Anda memerlukan -sflag (silent), -fflag (gagal dengan kode keluar saat error) dan dapat menggunakan -oflag untuk mengarahkan ulang output:

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected] 

Ini hanyalah contoh buruk untuk skrip cron sederhana. Biasanya, Anda hanya ingin mendapatkan satu email jika situs web rusak.

Jofel
sumber
8

Anda dapat menangkap statistik waktu jaringan dari curl. latensi setiap fase dalam siklus permintaan / respons dapat berguna untuk menentukan kesehatan.

$ 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
Corey Goldberg
sumber
2

Cara ini akan membantu Anda ketika mencoba menguji situs ketika https ada:

#!/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"
Kristen
sumber
1

Saya baru-baru ini diminta untuk membuat sesuatu yang akan bertindak lebih seperti detak jantung yang canggih.

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

Atau, diperluas agar lebih mudah dibaca,

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

Apa yang saya lakukan adalah curlsitus web, parsing semua tautan dari html, dan kemudian curltautan yang diurai tersebut, hanya menghasilkan kode status. Kemudian saya akan mencari kode status http> = 400 untuk menemukan kesalahan.

Elee
sumber
1

Menjawab:

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

Penjelasan:

  • timeout 3sakan menetapkan batas waktu 3 detik untuk permintaan Anda. Menjawab lebih lambat dianggap "tidak sehat"
  • -fBendera curl akan gagal lebih awal, -Sakan menunjukkan kesalahan, -sakan menekan output normal, -Ihanya akan mengambil header HTTP, bukan konten. (Seperti biasa, lebih banyak detail tersedia pada man curlperintah.)
  • directsl -checkenddirective memeriksa tanggal kedaluwarsa untuk suatu sertifikat. Dalam contoh saya, ini adalah 20 hari (ditentukan dalam detik).
VasyaNovikov
sumber
Saya pikir Anda memiliki penjelasan -sdan -Sbertukar
nafg
1

Curl memiliki kode status keluar yang sangat spesifik.
Mengapa tidak memeriksa saja?

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

Pemakaian:

$ site-status.sh example.com

Hasil:

$ example.com is online

Catatan:

Script ini hanya memeriksa apakah situs dapat diselesaikan.

Kode ini seharusnya membantu Anda jika yang Anda pedulikan adalah situsnya naik atau turun.
Namun, jika Anda membuat beberapa perubahan pada blok if / else, Anda dapat dengan mudah menguji kode status lainnya jika diinginkan

Silvernode
sumber