Tengo la sensación de que me falta lo obvio, pero no he tenido éxito con man [curl|wget]
o google ("http" hace un término de búsqueda tan malo). Estoy buscando una solución rápida y sucia para uno de nuestros servidores web que falla con frecuencia, devolviendo el código de estado 500 con un mensaje de error. Una vez que esto sucede, debe reiniciarse.
Como la causa raíz parece ser difícil de encontrar, buscamos una solución rápida, con la esperanza de que sea suficiente para cerrar el tiempo hasta que realmente podamos solucionarlo (el servicio no necesita alta disponibilidad)
La solución propuesta es crear un trabajo cron que se ejecute cada 5 minutos, verificando http: // localhost: 8080 / . Si esto vuelve con el código de estado 500, el servidor web se reiniciará. El servidor se reiniciará en menos de un minuto, por lo que no hay necesidad de verificar si los reinicios ya se están ejecutando.
El servidor en cuestión es una instalación mínima de ubuntu 8.04 con suficientes paquetes instalados para ejecutar lo que necesita actualmente. No hay un requisito difícil para hacer la tarea en bash, pero me gustaría que se ejecute en un entorno tan mínimo sin instalar más intérpretes.
(Estoy suficientemente familiarizado con los scripts que el comando / opciones para asignar el código de estado http a una variable de entorno sería suficiente; esto es lo que he buscado y no pude encontrar).
fuente
response=$(curl --write-out \\n%{http_code} --silent --output - servername)
la última línea en el resultado será el código de respuesta.--insecure
.trabajos. Si no, debe presionar regresar para ver el código en sí.
fuente
Necesitaba demostrar algo rápidamente hoy y se me ocurrió esto. Pensé que lo colocaría aquí si alguien necesitara algo similar a la solicitud del OP.
Esto enviará una alerta por correo electrónico sobre cada cambio de estado desde 200, por lo que es tonto y potencialmente codicioso. Para mejorar esto, consideraría recorrer varios códigos de estado y realizar diferentes acciones dependiendo del resultado.
fuente
Aunque la respuesta aceptada es una buena respuesta, pasa por alto los escenarios de falla.
curl
regresará000
si hay un error en la solicitud o si hay una falla en la conexión.Nota: esto va un poco más allá de la
500
verificación de estado solicitada para confirmar quecurl
incluso puede conectarse al servidor (es decir, regresa000
).Crea una función a partir de ella:
Prueba obteniendo un
500
:Prueba obteniendo error / falla de conexión (es decir
000
):Prueba no obteniendo un
500
:fuente
Con netcat y awk puede manejar la respuesta del servidor manualmente:
fuente
Para seguir los redireccionamientos 3XX e imprimir códigos de respuesta para todas las solicitudes:
fuente
grep
capturará todas las líneas con "http" en ellos. Tal vezgrep -m 1 HTTP
solo para agarrar la primera coincidencia, si esa es la intención, o tal vez en lugar de ir a Awk para analizar solo el código de resultado.Esto puede ayudar a evaluar el estado de http
fuente
head -n 1 | awk '{stuff}'
es un poco antipatrón,awk 'NR==1 {stuff}'
hace lo mismo en un proceso, puro Awk.Otra variante:
fuente
Aquí viene el guión largo, pero fácil de entender, inspirado en la solución de nicerobot , que solo solicita los encabezados de respuesta y evita usar IFS como se sugiere aquí . Emite un mensaje de rebote cuando encuentra una respuesta> = 400. Este eco se puede reemplazar con un script de rebote.
fuente
No me gustaron las respuestas aquí que mezclan los datos con el estado. encontró esto: agrega el indicador -f para que el rizo falle y seleccione el código de estado de error del estado estándar var: $?
/unix/204762/return-code-for-curl-used-in-a-command-substitution
No sé si es perfecto para cada escenario aquí, pero parece satisfacer mis necesidades y creo que es mucho más fácil trabajar con él.
fuente
Aquí está mi implementación, que es un poco más detallada que algunas de las respuestas anteriores
fuente
Para agregar a @DennisWilliamson el comentario anterior:
Luego puede analizar el código de respuesta de la respuesta usando algo como lo siguiente, donde X puede significar una expresión regular para marcar el final de la respuesta (usando un ejemplo de json aquí)
Consulte Eliminación de subcadenas: http://tldp.org/LDP/abs/html/string-manipulation.html
fuente
echo
para obtener el valor final? Justcode=${response##*\}}
es más simple y evita una serie de dificultades comunes. Además, ese es un patrón global, no una expresión regular adecuada.