Curl kullanarak web sayfasının sağlık kontrolü


34

Belirli bir URL'yi arayarak bir hizmeti sağlık kontrolü yapmak istiyorum. En basit çözüm her dakikayı kontrol etmek için cron kullanmak olacaktır. Hata durumunda, cron bana bir e-posta gönderir.

Bunun için cUrl kullanmaya çalıştım, ancak yalnızca hatalarla ilgili iletileri çıktısını alamıyorum. Çıktıyı / dev / null dizinine yönlendirmeye çalışırsam, ilerleme raporu yazdırır.

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

Kıvrılma seçeneklerine bakmaya çalıştım, ancak başarıda sessiz kalmasını istediğiniz duruma uygun bir şey bulamıyorum, ancak hatalarda ses çıkarıyorum.

Curl'un istediğimi yapmasını sağlamanın bir yolu var mı veya bakmam gereken başka bir araç var mı?


2
icingaBaşka bir izleme sistemi kullanmaya ne dersiniz ?
Stéphane Chazelas

Bunu, paylaşılan bir ana bilgisayarda sınırlı kaynakları olan bir hobi projesinde kullanıyorum. Aksi takdirde bir izleme sistemi kullanmayı çok isterim. Yine de bahşiş için teşekkürler, daha önce buzlanma duymamıştım
palto

Hesabınızdaki tüm sayfaları çok sık vurursanız, paylaşım sağlayıcılarının bu konuda kaşlarını çattığını belirtmek isterim. Sağlayıcılar tipik olarak eşzamanlı işlem sınırlarına ve maksimum yürütme zaman sınırlarına sahiptir. Ayrıca, siz ve sağlayıcının DC'si arasında bir şebeke kesintisi varsa, bu yöntem doğru olmaz. Paylaşılan hesabınızdaki etki alanı erişim günlüklerini araştırmalısınız. Genellikle botlardan gelen çok fazla trafik ve sitenizin ne kadar kullanılabilir olduğu konusunda size çok iyi bir fikir verecek rasgele ziyaretçiler var.
rcjohnson

Yanıtlar:


39

Ne hakkında -sSf? Man sayfalarından:

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

Örneğin:

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

3
-SS nedense hata mesajı vermedi. Ayrıca -f eklemek zorunda kaldım. Doğru çalışma komutu gibi görünüyor curl -fsS http://example.org > /dev/null. Bu yanlış bir şey olmadığında hiçbir şey çıkmaz, ancak durumumu bana göre olan hatalara basar.
palto

1
Tamam, -fgelecek referanslar için eklendi .
ahilsend

10

Sitenin canlı olup olmadığını kontrol etmenin en basit yolu için aşağıdaki yöntemi kullanabilirsiniz:

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

Bu geri dönecek HTTP/1.1 200 OK. Dönüş, çıktınızla eşleşmiyorsa yardım çağırın.


1
Durum kodunu kontrol etmek, diğer teklifler gibi daha mantıklı geliyor
Dukeatcoding,

"HTTP / 1.1 302 Bulundu" alıyorum.
Sünger Yoldaş

1
Bu harika, çünkü sitemin doğru yüklenip yüklenmediğini (mySQL bağlantısı vb.) Kontrol edip daha anlamlı sonuçlar almamı sağlayan bir ping'in ötesine geçiyor.
Nathan,

8

İhtiyacınız -s, (sessiz) bayrağını -fbayrak (hata çıkış koduyla başarısız) ve kullanabilirsiniz -oyönlendirme çıkışına bayrak:

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

Bu basit bir cron betiği için sadece kötü bir örnek. Normalde, bir web sitesi kapalı olduğunda yalnızca bir posta almak istersiniz.


8

curl'den ağ zamanlama istatistiklerini yakalayabilirsiniz. Bir talep / cevap döngüsündeki her bir fazın gecikmeleri sağlığı belirlemek için faydalı olabilir.

$ 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

Bu yol, https bulunduğunda siteyi test etmeye çalışırken size yardımcı olacaktır:

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

Geçenlerde daha sofistike bir kalp atışı gibi davranacak bir şey bulmam istendi.

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

Veya biraz daha okunabilirlik için genişletilmiş,

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

Yaptığım şey curlbir web curlsitesiydi, html'den ve sonra ayrıştırılan bağlantıları yalnızca durum kodunu çıkaran tüm bağlantıları ayrıştır. Ardından hataları bulmak için http durum kodlarını> = 400 arayacaktım.


1

Cevap:

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

açıklamalar:

  • timeout 3sisteğiniz için 3 saniye zaman aşımı belirleyecektir. Daha yavaş cevap vermek "sağlıklı değil" olarak kabul edilir.
  • curl -fbayrağı erken başarısız olur, -Shataları gösterir, -snormal çıktıları bastırır -I, içeriği değil yalnızca HTTP başlıklarını alır. (Her zaman olduğu gibi, man curlkomutta daha fazla ayrıntı bulunur .)
  • openssl -checkendyönergesi bir sertifikanın bitiş tarihini kontrol eder. Örneğim 20 gündür (saniye cinsinden belirtilir).

Sana açıklamalarını var -sve -Stakas
nafg

1

Curl'un çok özel çıkış durum kodları var.
Neden sadece kontrol etmiyorsunuz?

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

Kullanımı:

$ site-status.sh example.com

Sonuç:

$ example.com is online

Notlar:

Bu komut dosyası yalnızca site çözülebilirse denetler.

Tüm ilgilendiğiniz site yukarı veya aşağı ise bu kod sizi almalıdır.
Bununla birlikte, if / else bloğunda birkaç değişiklik yaparsanız, isterseniz diğer durum kodlarını kolayca test edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.