Bilan de santé d'une page Web à l'aide de curl

34

Je voudrais faire un bilan de santé d'un service en appelant une URL spécifique sur celui-ci. On dirait que la solution la plus simple serait d'utiliser cron pour effectuer le contrôle toutes les minutes environ. En cas d'erreur, cron m'envoie un email.

J'ai essayé d'utiliser cUrl pour cela, mais je ne parviens pas à envoyer des messages uniquement en cas d'erreur. Si j'essaie de diriger la sortie vers / dev / null, il affiche un rapport de progression.

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

J'ai essayé de regarder à travers les options de boucle, mais je ne trouve rien qui corresponde à la situation dans laquelle vous voulez que les choses soient silencieuses, mais que vous fassiez du bruit en cas d'erreur.

Existe-t-il un moyen de faire en sorte que curl fasse ce que je veux ou y a-t-il un autre outil que je devrais utiliser?

palto
la source
2
Comment utiliser icingaou tout autre système de surveillance?
Stéphane Chazelas
J'utilise ceci sur un projet de loisir avec des ressources limitées sur un hôte partagé. J'aimerais utiliser un système de surveillance autrement. Merci pour le tuyau de toute façon, je n'avais jamais entendu parler de icinga
palto
Je tiens à souligner que les fournisseurs d’hébergement pour serveurs de partage d’action vont être désapprouvés si vous consultez trop souvent toutes les pages de votre compte. Les fournisseurs ont généralement des limites de processus simultanées et des délais d'exécution maximaux. De plus, cette méthode ne sera pas précise s'il y a une panne de réseau entre vous et le CD du fournisseur. Vous devez examiner les journaux d’accès au domaine de votre compte partagé. Généralement, il y a beaucoup de trafic de bots et juste des visiteurs aléatoires qui vous donneront une très bonne idée de la disponibilité de votre site.
rcjohnson

Réponses:

39

Qu'en est- il -sSf? À partir des pages de manuel:

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

Par exemple:

curl -sSf http://example.org > /dev/null
ahilsend
la source
3
-sS n'a pas généré le message d'erreur pour une raison quelconque. Je devais aussi ajouter -f. La commande de travail correcte semble être curl -fsS http://example.org > /dev/null. Cela ne produira rien lorsque rien ne va pas, mais imprimera le code d'état sur les erreurs, ce qui me convient parfaitement.
Palto
1
Ok, ajouté -fpour les références futures.
ahilsend
10

Je pense que pour le moyen le plus simple de vérifier si le site est actif, vous pouvez utiliser la méthode suivante:

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

Cela va revenir HTTP/1.1 200 OK. Si le retour ne correspond pas à votre production, appelez à l'aide.

Raza
la source
1
La vérification du code d'état a probablement plus de sens que les autres propositions
Dukeatcoding
Je reçois "HTTP / 1.1 302 trouvé".
Éponge camarade
1
C’est formidable, car cela va au-delà d’un ping qui me permet de vérifier si mon site se charge correctement (connexion à MySQL, etc.) et d’obtenir des résultats plus significatifs.
Nathan
8

Vous avez besoin de l' -sindicateur (silencieux), de l' -findicateur (échec avec le code de sortie en cas d'erreur) et pouvez utiliser l' -oindicateur pour rediriger la sortie:

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

Ceci est juste un mauvais exemple pour un script cron simple. Normalement, vous ne voulez recevoir qu'un seul courrier si un site Web est en panne.

jofel
la source
8

vous pouvez capturer les statistiques de synchronisation du réseau de curl. les latences de chaque phase d'un cycle de requête / réponse peuvent être utiles pour déterminer la santé.

$ 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
la source
2

Cette façon de faire vous aidera lorsque vous essayez de tester le site lorsque https est présent:

#!/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"
Christian
la source
1

On m'a récemment demandé de proposer quelque chose qui agirait davantage comme un battement de coeur sophistiqué.

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

Ou, élargi pour un peu plus de lisibilité,

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

Ce que j'ai fait était curlun site Web, analyser tous les liens du curlcode HTML, puis ces liens analysés, en ne produisant que le code d'état. Ensuite, je rechercherais des codes d’état http> = 400 pour détecter les erreurs.

elee
la source
1

Répondre:

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

Explications:

  • timeout 3sfixera un délai d'attente de 3 secondes pour votre demande. Répondre plus lentement est considéré comme "pas sain"
  • curl -fflag échouera tôt, -Saffichera des erreurs, -ssupprimera la sortie normale, -Iextraira uniquement les en-têtes HTTP, pas le contenu. (Comme toujours, plus de détails sont disponibles surman curl commande.)
  • La -checkenddirective openssl vérifie les dates d'expiration d'un certificat. Dans mon exemple, c'est 20 jours (spécifié en secondes).
VasyaNovikov
la source
Je pense que vous avez les explications de -set -Séchangé
nafg
1

Curl a des codes de statut de sortie très spécifiques.
Pourquoi ne pas simplement vérifier ceux-ci?

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

Usage:

$ site-status.sh example.com

Résultat:

$ example.com is online

Remarques:

Ce script vérifie uniquement si le site peut être résolu.

Ce code devrait vous guider si tout ce qui vous intéresse est que le site soit en haut ou en bas.
Cependant, si vous apportez quelques modifications au bloc if / else, vous pouvez facilement tester d’autres codes d’état si vous le souhaitez.

Silvernode
la source