Controllo dello stato della pagina Web utilizzando l'arricciatura


34

Vorrei fare un controllo sanitario di un servizio chiamando un URL specifico su di esso. Sembra che la soluzione più semplice sarebbe usare cron per fare il controllo ogni minuto o giù di lì. In caso di errori, cron mi invia un'email.

Ho provato a usare cUrl per questo, ma non riesco a farlo emettere messaggi solo in caso di errori. Se provo a indirizzare l'output su / dev / null, stampa il rapporto sullo stato di avanzamento.

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

Ho provato a cercare tra le opzioni di arricciatura ma non riesco proprio a trovare nulla che si adatti alla situazione in cui vuoi che sia silenzioso in caso di successo ma fai rumore sugli errori.

C'è un modo per fare in modo che l'arricciatura faccia quello che voglio o c'è qualche altro strumento che dovrei guardare?


2
Che ne dici di utilizzare icingao qualsiasi altro sistema di monitoraggio?
Stéphane Chazelas,

Sto usando questo su un progetto di hobby con risorse limitate su un host condiviso. Mi piacerebbe altrimenti utilizzare un sistema di monitoraggio. Grazie per la punta in ogni modo, non avevano sentito parlare di icinga prima
palto

Vorrei sottolineare che i provider di hosting condiviso non apprezzeranno questo aspetto se colpisci tutte le pagine del tuo account troppo frequentemente. I provider in genere hanno limiti di processo simultanei e limiti di tempo max. Inoltre, questo metodo non sarà accurato in caso di interruzione di rete tra l'utente e il controller di dominio del provider. È necessario esaminare i registri di accesso al dominio sul proprio account condiviso. In genere c'è molto traffico da bot e solo visitatori casuali che ti daranno un'ottima idea di quanto sia disponibile il tuo sito.
rcjohnson,

Risposte:


39

Che dire -sSf? Dalle pagine man:

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

Per esempio:

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

3
-sS non ha generato il messaggio di errore per qualche motivo. Ho dovuto aggiungere anche -f. Il comando corretto sembra essere curl -fsS http://example.org > /dev/null. Ciò non produrrà nulla quando non c'è nulla di sbagliato ma stamperà il codice di stato sugli errori che va bene per me.
palto,

1
Ok, aggiunto -fper riferimenti futuri.
ahilsend,

10

Penso che per il modo più semplice per verificare se il sito è vivo, è possibile utilizzare il seguente metodo:

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

Questo tornerà HTTP/1.1 200 OK. Se il reso non corrisponde al tuo output, chiedi aiuto.


1
Il controllo del codice di stato ha probabilmente più senso delle altre proposte
Dukeatcoding il

Ottengo "HTTP / 1.1 302 Found".
Compagno di spugna,

1
Questo è fantastico perché va oltre un ping che mi permette di verificare se il mio sito si sta caricando correttamente (connessione a mySQL ecc.) E ottenere risultati più significativi.
Nathan,

8

È necessario il -sflag (silenzioso), il -fflag (errore con codice di uscita in caso di errore) e è possibile utilizzare il -oflag per reindirizzare l'output:

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

Questo è solo un cattivo esempio per un semplice script cron. Normalmente, vuoi ricevere solo una mail se un sito web non è attivo.


8

puoi catturare le statistiche di temporizzazione della rete dall'arricciatura. le latenze di ciascuna fase in un ciclo di richiesta / risposta possono essere utili per determinare l'integrità.

$ 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

In questo modo ti aiuterà quando provi a testare il sito quando è presente 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

Di recente mi è stato chiesto di inventare qualcosa che potesse comportarsi più come un sofisticato battito cardiaco.

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

Oppure, espanso per un po 'più di leggibilità,

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

Quello che ho fatto è stato curlun sito Web, analizzare tutti i collegamenti dall'html e quindi curlquei collegamenti analizzati, producendo solo il codice di stato. Quindi vorrei cercare i codici di stato http> = 400 per trovare errori.


1

Risposta:

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

spiegazioni:

  • timeout 3simposterà un timeout di 3 secondi per la tua richiesta. La risposta più lenta viene considerata "non salutare"
  • l'arricciatura -ffallirà presto, -Smostrerà errori, -ssopprimerà l'output normale, -Irecupererà solo le intestazioni HTTP, non il contenuto. (Come sempre, ulteriori dettagli sono disponibili a man curlcomando.)
  • La -checkenddirettiva openssl controlla le date di scadenza di un certificato. Nel mio esempio, sono 20 giorni (specificati in secondi).

Penso che tu abbia le spiegazioni -se lo -Sscambio
nafg

1

Curl ha codici di stato di uscita molto specifici
Perché non controllarli?

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

Uso:

$ site-status.sh example.com

Risultato:

$ example.com is online

Gli appunti:

Questo script verifica solo se il sito può essere risolto.

Questo codice dovrebbe farti capire se tutto ciò che ti interessa è che il sito sia attivo o inattivo.
Tuttavia, se si apportano alcune modifiche al blocco if / else, è possibile verificare facilmente altri codici di stato, se lo si desidera

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.