Tengo la sensación de que me estoy perdiendo lo obvio, pero no han tenido éxito con man [curl|wget] o google («http» hace una mala término de búsqueda). Estoy en busca de un rápido&sucio revisión a uno de nuestros servidores web que falla con frecuencia, devolver el código de estado 500 con un mensaje de error. Una vez que esto sucede, se necesita ser reiniciado.

Como la raíz de la causa parece ser difícil de encontrar, estamos buscando una solución rápida, con la esperanza de que va a ser suficiente para reducir el tiempo hasta que realmente podemos solucionarlo (el servicio no necesitan una alta disponibilidad)

La solución propuesta es crear una tarea cron que se ejecuta cada 5 minutos, comprobando http://localhost:8080/. Si este devuelve con el código de estado 500, el servidor se reiniciará. El servidor se reiniciará en menos de un minuto, así que no hay necesidad de comprobar reinicia ya en ejecución.

El servidor en cuestión es un ubuntu 8.04 instalación mínima con suficiente paquetes instalados para ejecutar lo que se necesita. No hay ninguna necesidad de hacer la tarea en bash, pero me gustaría que se ejecutan en un entorno mínimo, sin necesidad de instalar más intérpretes.

(Estoy lo suficientemente familiarizado con las secuencias de comandos que el comando/opciones para asignar el código de estado http para una variable de entorno sería suficiente – esto es lo que he buscado y no pude encontrar.)

InformationsquelleAutor Olaf Kock | 2010-02-08

10 Comentarios

  1. 280

    No he probado esto en un 500 código, pero funciona en otros como 200, 302 y 404.

    response=$(curl --write-out %{http_code} --silent --output /dev/null servername)

    Según lo sugerido por @ibai, agregar --head para hacer una CABEZA única solicitud. Esto le ahorrará tiempo cuando la recuperación es exitosa ya que el contenido de la página no será transmitida.

    • Niza – gracias: ya he encontrado –escribe -, pero se perdió el –output /dev/null. Cuando todo el contenido que viene con él, el código de respuesta se pierde en demasiada información, así que yo simplemente no la veo…
    • Puedo almacenar el código de la respuesta y la salida en las variables independientes? Me gustaría hacer eco de la salida, cuando el código de respuesta no es 200
    • Intente esto: response=$(curl --write-out \\n%{http_code} --silent --output - servername) – la última línea en el resultado va a ser el código de respuesta.
    • Esto no muestra el último estado de la solicitud si el resultado de la primera solicitud es una 3XX. Por ejemplo, si el valor devuelto es un redireccionamiento 301, entonces este script solo se detiene allí. Si agrega -IL, a continuación, usted puede obtener el estado final. Si usted desea mostrar todos los HTTP estados para todas las solicitudes, uso mi ejemplo a continuación.
    • Gran trabajo, gracias! Sin embargo, en mi caso (https) que necesitaba para poner --insecure así.
    • Puede utilizar -I o-cabeza hacer una CABEZA de solicitud y evitar la descarga de todo el cuerpo, incluso si es a /dev/null. Esto puede reducir el tiempo de ejecución considerablemente en muchos de los casos. response=$(curl --head --write-out %{http_code} --silent --output /dev/null servername)

  2. 38
    curl --write-out "%{http_code}\n" --silent --output /dev/null "$URL"

    obras. Si no, usted tiene que golpear a volver a ver el código en sí.

  3. 17

    Necesitaba para hacer una demostración de algo rápidamente el día de hoy y me encontré con esto. Pensé que iba a colocarlo aquí si alguien necesitaba algo similar a la OP de la solicitud.

    #!/bin/bash
    
    status_code=$(curl --write-out %{http_code} --silent --output /dev/null www.bbc.co.uk/news)
    
    if [[ "$status_code" -ne 200 ]] ; then
      echo "Site status changed to $status_code" | mail -s "SITE STATUS CHECKER" "[email protected]" -r "STATUS_CHECKER"
    else
      exit 0
    fi

    Esto enviará una alerta de correo electrónico en cada cambio de estado de 200, así que es tonto y potencialmente codiciosos. Para mejorar esto, me gustaría ver en bucle a través de varios códigos de estado y la realización de diferentes acciones dependiendo del resultado.

  4. 17

    Aunque la respuesta aceptado es una buena respuesta, con vistas a situaciones de error. curl volverá 000 si hay un error en la solicitud o hay un fallo de conexión.

    url='http://localhost:8080/'
    status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
    [[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # do start/restart logic

    Nota: esto va un poco más allá de la solicitada 500 estado de verificación para confirmar también que la curl incluso puede conectar con el servidor (es decir, devuelve 000).

    Crear una función de ella:

    failureCode() {
        local url=${1:-http://localhost:8080}
        local code=${2:-500}
        local status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
        [[ $status == ${code} ]] || [[ $status == 000 ]]
    }

    Prueba de conseguir un 500:

    failureCode http://httpbin.org/status/500 && echo need to restart

    Prueba recibiendo el error/error de conexión (es decir,000):

    failureCode http://localhost:77777 && echo need to start

    Prueba de no llegar a un 500:

    failureCode http://httpbin.org/status/400 || echo not a failure
  5. 9

    Con netcat y awk puede controlar la respuesta del servidor manualmente:

    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
  6. 8

    A seguir 3XX y redirecciones de impresión de códigos de respuesta para todas las solicitudes:

    HTTP_STATUS="$(curl -IL --silent example.com | grep HTTP )";    
    echo "${HTTP_STATUS}";
    • El grep de captura de todas las líneas con «HTTP» en ellos. Tal vez grep -m 1 HTTP a sólo agarrar el primer partido, si esa es la intención, o tal vez en lugar de la tubería de Awk para analizar sólo el código de resultado.
  7. 2

    Aquí viene el largo aliento – pero fácil de entender, el guión, inspirado en la solución de nicerobot, que sólo las solicitudes de los encabezados de respuesta y evita el uso de IFS como se sugiere aquí. Se emite un mensaje de rechazo cuando se encuentra con una respuesta >= 400. Este echo puede ser reemplazado con un rebote-script.

    # set the url to probe
    url='http://localhost:8080'
    # use curl to request headers (return sensitive default on timeout: "timeout 500"). Parse the result into an array (avoid settings IFS, instead use read)
    read -ra result <<< $(curl -Is --connect-timeout 5 "${url}" || echo "timeout 500")
    # status code is second element of array "result"
    status=${result[1]}
    # if status code is greater than or equal to 400, then output a bounce message (replace this with any bounce script you like)
    [ $status -ge 400  ] && echo "bounce at $url with status $status"
  8. 2

    Otra variación:

           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-)
    • Esto debe ser aceptado respuesta
  9. 1

    esto puede ayudar a evaluar el estado de http

    var=`curl -I http://www.example.org 2>/dev/null | head -n 1 | awk -F" " '{print $2}'`
    echo http:$var
    • head -n 1 | awk '{stuff}' es un poco de un antipattern, awk 'NR==1 {stuff}' hace la misma cosa en uno de los procesos, puro Awk.
  10. 0

    Para agregar a @DennisWilliamson comentario anterior:

    @VaibhavBajpai: prueba esto: respuesta=$(curl-escribir-out \n%{http_code} –silent –output – servername) – la última línea en el resultado va a ser el código de respuesta

    Usted puede, a continuación, analizar el código de respuesta de la respuesta usando algo como la siguiente, donde X puede significar un regex para marcar el final de la respuesta (utilizando json ejemplo aquí)

    X='*\}'
    code=$(echo ${response##$X})

    Ver Subcadena De Eliminación: http://tldp.org/LDP/abs/html/string-manipulation.html

    • ¿Por qué poner el patrón en una variable, y ¿por qué usar un inútil echo para obtener el valor final? Sólo code=${response##*\}} es más sencillo y evita una serie de problemas comunes. También, que es un pegote patrón, no una correcta expresión regular.

Dejar respuesta

Please enter your comment!
Please enter your name here