249 votes

Comment évaluer les codes de réponse http à partir de bash/shell script ?

J'ai l'impression de passer à côté de l'évidence, mais je n'ai pas réussi à man [curl|wget] ou Google (le terme "http" n'est pas un bon critère de recherche). Je suis à la recherche d'une solution rapide pour l'un de nos serveurs Web qui échoue fréquemment, renvoyant le code d'état 500 avec un message d'erreur. Une fois que cela se produit, il doit être redémarré.

Comme la cause fondamentale semble difficile à trouver, nous cherchons une solution rapide, en espérant qu'elle suffira à combler le temps jusqu'à ce que nous puissions vraiment la réparer (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, vérifiant http://localhost:8080/ . Si le code d'état 500 est renvoyé, le serveur Web sera redémarré. Le serveur sera redémarré en moins d'une minute, il n'est donc pas nécessaire de vérifier si des redémarrages sont déjà en cours.

Le serveur en question est une installation minimale ubuntu 8.04 avec juste assez de paquets installés pour faire fonctionner ce dont il a besoin actuellement. Il n'y a pas d'exigence stricte pour effectuer la tâche en bash, mais j'aimerais qu'elle fonctionne dans un tel environnement minimal sans installer d'autres interpréteurs.

(Je suis suffisamment familier avec les scripts pour que la commande/les options permettant d'assigner le code d'état http à une variable d'environnement soient suffisantes - c'est ce que j'ai cherché et que je n'ai pas trouvé).

9voto

marco Points 1678

Avec netcat et awk, vous pouvez traiter la réponse du serveur manuellement :

if netcat 127.0.0.1 8080 <<EOF | awk 'NR==1{if ($2 == "500") exit 0; exit 1;}'; then
GET / HTTP/1.1
Host: www.example.com

EOF

    apache2ctl restart;
fi

0 votes

netcat est pratiquement inutile à l'heure où le HTTPS est pratiquement omniprésent. Utilisez openssl s_client à la place.

8voto

siliconrockstar Points 361

Pour suivre les redirections 3XX et imprimer les codes de réponse pour toutes les demandes :

HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
echo "${HTTP_STATUS}";

4voto

nathan g Points 38

Je n'ai pas aimé les réponses qui mélangent les données avec le statut. J'ai trouvé ceci : vous ajoutez le drapeau -f pour que curl échoue et récupère le code d'erreur du statut standard var : $ ?

https://unix.stackexchange.com/questions/204762/return-code-for-curl-used-in-a-command-substitution

je ne sais pas si elle est parfaite pour tous les scénarios, mais elle semble répondre à mes besoins et je pense qu'elle est beaucoup plus facile à utiliser

3voto

Tango Points 31

Cela peut aider à évaluer le statut http

var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
echo http:$var

3voto

dkinzer Points 6339

Une autre variation :

       status=$(curl -sS  -I https://www.healthdata.gov/user/login  2> /dev/null | head -n 1 | cut -d' ' -f2)
status_w_desc=$(curl -sS  -I https://www.healthdata.gov/user/login  2> /dev/null | head -n 1 | cut -d' ' -f2-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X