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?
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
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.
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.
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
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"-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.)-checkend
la directive vérifie les dates d'expiration d'un certificat. Dans mon exemple, c'est 20 jours (spécifié en secondes).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"
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
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.