J'ai le sentiment que je manque l'évidence, mais je n'ai pas réussi avec man [curl|wget]
ou google ("http" fait un si mauvais terme de recherche). Je cherche une solution rapide et sale à 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 première semble difficile à trouver, nous visons une solution rapide, en espérant qu'elle suffira à combler le temps jusqu'à ce que nous puissions vraiment la résoudre (le service n'a pas besoin de haute disponibilité)
La solution proposée consiste à créer un travail cron qui s'exécute toutes les 5 minutes, en vérifiant http: // localhost: 8080 / . Si cela revient avec le code d'état 500, le serveur Web sera redémarré. Le serveur redémarrera dans moins d'une minute, il n'est donc pas nécessaire de vérifier les redémarrages déjà en cours d'exécution.
Le serveur en question est une installation minimale ubuntu 8.04 avec juste assez de packages installés pour exécuter ce dont il a besoin actuellement. Il n'y a aucune exigence difficile pour effectuer la tâche dans bash, mais j'aimerais qu'elle s'exécute dans un environnement aussi minimal sans installer plus d'interprètes.
(Je suis suffisamment familier avec les scripts pour que la commande / options pour attribuer le code de statut http à une variable d'environnement soit suffisante - c'est ce que j'ai cherché et que je n'ai pas pu trouver.)
la source
response=$(curl --write-out \\n%{http_code} --silent --output - servername)
- la dernière ligne du résultat sera le code de réponse.--insecure
.travaux. Sinon, vous devez appuyer sur Retour pour afficher le code lui-même.
la source
J'avais besoin de faire une démonstration rapide de quelque chose aujourd'hui et j'ai trouvé ça. Je pensais que je le placerais ici si quelqu'un avait besoin de quelque chose de similaire à la demande du PO.
Cela enverra une alerte par e-mail à chaque changement d'état de 200, donc c'est stupide et potentiellement gourmand. Pour améliorer cela, je chercherais à parcourir plusieurs codes d'état et à effectuer différentes actions en fonction du résultat.
la source
Bien que la réponse acceptée soit une bonne réponse, elle ignore les scénarios d'échec.
curl
retournera000
s'il y a une erreur dans la demande ou en cas d'échec de connexion.Remarque: cela va un peu au-delà de la
500
vérification d'état demandée pour confirmer également que vouscurl
pouvez même vous connecter au serveur (c'est-à-dire les retours000
).Créez-en une fonction:
Testez l'obtention d'un
500
:Tester l'erreur / l'échec de connexion (c.-à-d.
000
):Le test ne reçoit pas
500
:la source
Avec netcat et awk, vous pouvez gérer la réponse du serveur manuellement:
la source
Pour suivre les redirections 3XX et imprimer les codes de réponse pour toutes les demandes:
la source
grep
capturera toutes les lignes contenant "HTTP". Peut-êtregrep -m 1 HTTP
pour ne saisir que la première correspondance, si c'est l'intention, ou peut-être plutôt diriger vers Awk pour analyser uniquement le code de résultat.cela peut aider à évaluer le statut http
la source
head -n 1 | awk '{stuff}'
est un peu un contre-modèle,awk 'NR==1 {stuff}'
fait la même chose en un seul processus, Awk pur.Une autre variante:
la source
Voici le script de longue haleine - mais facile à comprendre -, inspiré de la solution de nicerobot , qui ne demande que les en-têtes de réponse et évite d'utiliser IFS comme suggéré ici . Il émet un message de rebond lorsqu'il rencontre une réponse> = 400. Cet écho peut être remplacé par un script de rebond.
la source
je n'ai pas aimé les réponses ici qui mélangent les données avec le statut. trouvé ceci: vous ajoutez l'indicateur -f pour que curl échoue et récupérez le code d'état d'erreur dans le statut standard var: $?
/unix/204762/return-code-for-curl-used-in-a-command-substitution
Je ne sais pas si c'est parfait pour tous les scénarios ici, mais cela semble correspondre à mes besoins et je pense qu'il est beaucoup plus facile de travailler avec
la source
Voici mon implémentation, qui est un peu plus détaillée que certaines des réponses précédentes
la source
Pour ajouter au commentaire @DennisWilliamson ci-dessus:
Vous pouvez ensuite analyser le code de réponse de la réponse en utilisant quelque chose comme le suivant, où X peut signifier une expression régulière pour marquer la fin de la réponse (en utilisant un exemple json ici)
Voir Suppression de sous-chaîne: http://tldp.org/LDP/abs/html/string-manipulation.html
la source
echo
pour obtenir la valeur finale? Toutcode=${response##*\}}
est plus simple et évite un certain nombre d’écueils courants. En outre, c'est un modèle global, pas une expression régulière appropriée.