Comment évaluer les codes de réponse http à partir de bash/shell script?
J'ai le sentiment que je suis absent ce qui est évident, mais n'ont pas réussi à man [curl|wget]
ou de google ("http" fait une mauvaise terme de recherche). Je suis à la recherche d'un rapide&sale fixer à l'un de nos serveurs web qui, souvent, ne, retourner le code d'état de 500 avec un message d'erreur. Une fois que cela arrive, il doit être redémarré.
Comme la cause semble être difficile à trouver, nous visons une solution rapide, en espérant que cela sera suffisant pour combler le temps jusqu'à ce que l'on peut vraiment résoudre (le service n'a pas besoin de haute disponibilité)
La solution proposée est de créer une tâche cron qui s'exécute toutes les 5 minutes, en vérifiant http://localhost:8080/. Si cela renvoie avec le code d'état 500, le serveur va être redémarré. Le serveur va redémarrer en moins d'une minute, il n'ya donc pas besoin de vérifier pour les redémarrages déjà en cours d'exécution.
Le serveur en question est une ubuntu 8.04 installation minimale avec juste assez de paquets installé pour exécuter ce qu'elle a besoin. Il n'y a aucune obligation de faire la tâche en bash, mais j'aimerais qu'il lancer dans un tel environnement minimal sans avoir à installer de plusieurs interprètes.
(Je suis suffisamment familiarisé avec l'écriture de scripts de commande/d'options à attribuer le code de statut http à une variable d'environnement serait assez - c'est ce que j'ai cherché et ne pouvait pas trouver.)
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas testé cela sur un 500 code, mais il fonctionne sur d'autres, comme 200, 302 et 404.
Comme suggéré par @ibai, ajouter
--head
pour faire une TÊTE seule demande. Cela permettra de gagner du temps lors de la recherche est couronnée de succès, avec le contenu de la page ne sera pas transmis.response=$(curl --write-out \\n%{http_code} --silent --output - servername)
- la dernière ligne dans le résultat sera le code de réponse.--insecure
ainsi.response=$(curl --head --write-out %{http_code} --silent --output /dev/null servername)
œuvres. Si non, vous devez appuyer sur la touche entrée pour afficher le code lui-même.
J'avais besoin de faire la démonstration de quelque chose rapidement aujourd'hui et est venu avec cette. Pensé que je pourrais le placer ici si quelqu'un a besoin de quelque chose de similaire à la demande du commettant.
Cela enverra une alerte email à chaque changement d'état à partir de 200, de sorte qu'il est bête et potentiellement gourmand. Pour améliorer cela, je regarde en boucle à travers plusieurs codes d'état et de l'exécution des différentes actions de la personne à charge sur le résultat.
Bien que le réponse acceptée est une bonne réponse, il donne sur les scénarios d'échec.
curl
sera de retour000
si il y a une erreur dans la requête ou d'échec de connexion.Remarque: cela va un peu au-delà de la demande
500
vérification de l'état à confirmer également quecurl
pouvez même vous connecter au serveur (c'est à dire renvoie000
).Créer une fonction à partir d'elle:
Test de l'obtention d'un
500
:Test d'erreur/d'échec de la connexion (c'est à dire
000
):Test de ne pas obtenir un
500
:Avec netcat et awk vous pouvez gérer la réponse du serveur manuellement:
À suivre 3XX redirections et d'imprimer des codes de réponse pour toutes les demandes:
grep
permettra de saisir toutes les lignes avec "HTTP" dans les. Peut-êtregrep -m 1 HTTP
à seulement saisir le premier match, si c'est l'intention, ou peut-être lieu de tuyau de Awk pour analyser seulement le code de résultat.Voici le de longue haleine- et pourtant facile à comprendre – le scénario, inspiré par la solution de nicerobot, qui demande uniquement les en-têtes de réponse et évite d'utiliser IFS comme l'a suggéré ici. Elle génère un message de renvoi lorsqu'il rencontre une réponse >= 400. Cet écho peut être remplacé par un rebond de script.
Une autre variation:
cela peut aider à évaluer l'état http
head -n 1 | awk '{stuff}'
est un peu un antipattern,awk 'NR==1 {stuff}'
fait la même chose dans un processus de pure Awk.À ajouter à @DennisWilliamson commentaire ci-dessus:
Vous pouvez ensuite d'analyser le code de réponse de la réponse à l'aide de quelque chose comme le suivant, où X peut signifier une regex pour marquer la fin de la réponse (à l'aide d'un json exemple ici)
Voir La Sous-Chaîne De Suppression: http://tldp.org/LDP/abs/html/string-manipulation.html
echo
pour obtenir la valeur finale? Justecode=${response##*\}}
est plus simple et évite un certain nombre d'écueils. Aussi, c'est une boule de patron, pas une bonne expression régulière.