Kontrola stanu strony internetowej za pomocą curl

34

Chciałbym przeprowadzić kontrolę stanu usługi, dzwoniąc na określony adres URL. Wydaje się, że najprostszym rozwiązaniem byłoby użycie crona do sprawdzania co około minutę. W przypadku błędów cron wysyła mi wiadomość e-mail.

Próbowałem do tego celu użyć cUrl, ale nie mogę uzyskać wyprowadzania komunikatów tylko w przypadku błędów. Jeśli spróbuję skierować dane wyjściowe do / dev / null, drukuje raport postępu.

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

Próbowałem przejrzeć opcje zawijania, ale po prostu nie mogę znaleźć niczego, co pasowałoby do sytuacji, w której chciałbyś, aby cicho mówiła o sukcesie, ale hałasowała przy błędach.

Czy istnieje sposób, aby curl robił to, co chcę, czy jest jakieś inne narzędzie, na które powinienem patrzeć?

palto
źródło
2
Co powiesz na korzystanie icingalub inny system monitorowania?
Stéphane Chazelas
Używam tego w projekcie hobby z ograniczonymi zasobami na wspólnym hoście. W innym przypadku chciałbym użyć systemu monitorowania. W każdym razie dzięki za napiwek, nie słyszałem wcześniej o icinga
palto
Chciałbym zauważyć, że dostawcy hostingu udostępnionego będą się z tego powodu zadowoleni, jeśli zbyt często odwiedzasz wszystkie strony na swoim koncie. Dostawcy zazwyczaj mają równoległe limity procesów i maksymalne limity czasu wykonania. Również ta metoda nie będzie dokładna, jeśli nastąpi awaria sieci między Tobą a DC usługodawcy. Powinieneś zapoznać się z dziennikami dostępu do domeny na koncie udostępnionym. Zazwyczaj jest duży ruch ze strony botów i tylko przypadkowych użytkowników, co daje bardzo dobry obraz dostępności witryny.
rcjohnson

Odpowiedzi:

39

Co -sSf? Ze stron podręcznika:

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

Na przykład:

curl -sSf http://example.org > /dev/null
ahilsend
źródło
3
-sS z jakiegoś powodu nie wyświetlił komunikatu o błędzie. Musiałem także dodać -f. Wydaje się, że poprawne polecenie robocze jest curl -fsS http://example.org > /dev/null. To nie wyświetli niczego, gdy nic nie jest źle, ale wydrukuje kod stanu przy błędach, co jest dla mnie w porządku.
palto
1
Ok, dodano -fdo przyszłych odniesień.
ahilsend
10

Myślę, że w najprostszy sposób, aby sprawdzić, czy strona jest żywa, możesz użyć następującej metody:

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

To wróci HTTP/1.1 200 OK. Jeśli zwrot nie odpowiada twojemu wynikowi, wezwij pomoc.

Raza
źródło
1
Sprawdzanie kodu stanu ma prawdopodobnie większy sens niż inne propozycje
Dukeatcoding
Dostaję komunikat „Znaleziono HTTP / 1.1 302”.
Towarzysz gąbki
1
Jest to świetne, ponieważ wykracza poza ping, co pozwala mi sprawdzić, czy moja strona ładuje się poprawnie (połączenie z mySQL itp.) I uzyskać bardziej znaczące wyniki.
Nathan
8

Potrzebujesz -sflagi (cicha), -fflagi (błąd z kodem wyjścia w przypadku błędu) i możesz użyć -oflagi do przekierowania danych wyjściowych:

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

To tylko zły przykład prostego skryptu cron. Zwykle chcesz dostać tylko jedną pocztę, jeśli witryna nie działa.

Jofel
źródło
8

możesz przechwytywać statystyki synchronizacji sieci z curl. opóźnienia w każdej fazie w cyklu żądanie / odpowiedź mogą być przydatne do określenia stanu zdrowia.

$ 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
źródło
2

Ten sposób pomoże ci podczas próby przetestowania witryny, gdy obecny jest 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"
chrześcijanin
źródło
1

Ostatnio poproszono mnie o wymyślenie czegoś, co działałoby bardziej jak wyrafinowane bicie serca.

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

Lub rozszerzony dla nieco większej czytelności,

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

To, co zrobiłem, curlto strona internetowa, analizując wszystkie linki z html, a następnie curlte przeanalizowane linki, wyświetlając tylko kod stanu. Następnie szukałem kodów stanu http> = 400, aby znaleźć błędy.

elee
źródło
1

Odpowiedź:

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

Objaśnienia:

  • timeout 3sustawi 3-sekundowy limit czasu dla twojego żądania. Wolniejsze odpowiadanie jest uważane za „niezdrowe”
  • -fflaga curl nie powiedzie się wcześnie, -Spokaże błędy, -spominie normalne wyjście, -Ipobierze tylko nagłówki HTTP, a nie treść. (Jak zawsze więcej szczegółów dostępnych jest na man curlpolecenie).
  • -checkendDyrektywa openssl sprawdza daty ważności certyfikatu. W moim przykładzie jest to 20 dni (określone w sekundach).
VasyaNovikov
źródło
Myślę, że masz wyjaśnienia -si -Szamieniono
nafg
1

Curl ma bardzo specyficzne kody stanu wyjścia.
Dlaczego nie po prostu ich sprawdzić?

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

Stosowanie:

$ site-status.sh example.com

Wynik:

$ example.com is online

Uwagi:

Ten skrypt sprawdza tylko, czy daną stronę można rozwiązać.

Ten kod powinien Cię załatwić, jeśli jedyne, na czym Ci zależy, to że witryna jest w górę lub w dół.
Jeśli jednak wprowadzisz kilka zmian w bloku if / else, możesz z łatwością przetestować inne kody stanu, jeśli chcesz

Silvernode
źródło