web-dev-qa-db-fra.com

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

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

J'ai essayé d'utiliser cUrl pour cela, mais je ne peux pas obtenir de messages de sortie uniquement en cas d'erreur. Si j'essaie de diriger la sortie vers/dev/null, il affiche le 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 convienne à la situation où vous voulez qu'il soit silencieux sur le succès mais fasse du bruit sur les erreurs.

Existe-t-il un moyen de faire faire à curl ce que je veux ou existe-t-il un autre outil que je devrais examiner?

37
palto

Qu'en est-il de -sSf? Depuis les 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
42
ahilsend

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

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

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

13
Raza

Vous avez besoin du -s drapeau (silencieux), -f flag (échec avec le code de sortie en cas d'erreur) et peut utiliser le -o drapeau 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 simple script cron. Normalement, vous ne souhaitez recevoir qu'un seul e-mail si un site Web est en panne.

9
jofel

vous pouvez capturer les statistiques de synchronisation du réseau à partir de curl. les latences de chaque phase d'un cycle de demande/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
9
Corey Goldberg

Réponse:

#!/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 3s définira un délai de 3 secondes pour votre demande. Répondre plus lentement est considéré comme "non sain"
  • curl -f l'indicateur échouera tôt, -S affichera des erreurs, -s supprimera la sortie normale, -I ne récupérera que les en-têtes HTTP, pas le contenu. (Comme toujours, plus de détails sont disponibles sur man curl commande.)
  • openssl -checkend la directive vérifie les dates d'expiration d'un certificat. Dans mon exemple, c'est 20 jours (spécifié en secondes).
2
VasyaNovikov

Cette méthode vous aidera lorsque vous tenterez 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"
2
christian

Curl a des codes d'état de sortie très spécifiques
Pourquoi ne pas simplement les vérifier?

#!/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 aider si tout ce qui vous intéresse est le site en cours de montée ou de descente.
Cependant, si vous apportez quelques modifications au bloc if/else, vous pouvez facilement tester d'autres codes d'état si vous le souhaitez

2
Silvernode

On m'a récemment demandé de proposer quelque chose qui agirait plus comme un rythme cardiaque 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, étendu 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 curl un site Web, analyser tous les liens du code HTML, puis curl ces liens analysés, ne produisant que le code d'état. Ensuite, je rechercherais les codes d'état http> = 400 pour trouver des erreurs.

1
elee