Verificación de estado de la página web usando curl

34

Me gustaría hacer un control de salud de un servicio llamando a una URL específica. Parece que la solución más simple sería usar cron para hacer la verificación cada minuto más o menos. En caso de errores, cron me envía un correo electrónico.

Intenté usar cUrl para esto, pero no consigo que envíe mensajes solo por errores. Si intento dirigir la salida a / dev / null, imprime el informe de progreso.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5559  100  5559    0     0   100k      0 --:--:-- --:--:-- --:--:--  106k

Intenté mirar a través de las opciones de rizo, pero simplemente no puedo encontrar nada que se adapte a la situación en la que desea que se mantenga en silencio sobre el éxito, pero haga ruido en los errores.

¿Hay alguna manera de hacer que el rizo haga lo que quiero o hay alguna otra herramienta que debería mirar?

palto
fuente
2
¿Qué tal el uso icingao cualquier otro sistema de monitoreo?
Stéphane Chazelas
Estoy usando esto en un proyecto de pasatiempo con recursos limitados en un host compartido. Me encantaría usar un sistema de monitoreo de lo contrario. Gracias por el consejo de todos modos, no había oído hablar de icinga antes
palto
Me gustaría señalar que los proveedores de alojamiento compartido no estarán de acuerdo con esto si está accediendo a todas las páginas de su cuenta con demasiada frecuencia. Los proveedores suelen tener límites de proceso concurrentes y límites máximos de tiempo de ejecución. Además, este método no será exacto si hay una interrupción de la red entre usted y el DC del proveedor. Debe investigar los registros de acceso al dominio en su cuenta compartida. Por lo general, hay mucho tráfico de bots y solo visitantes aleatorios que le darán una muy buena idea de la disponibilidad de su sitio.
rcjohnson

Respuestas:

39

¿Qué hay de -sSf? De las páginas del manual:

  -s/--silent
     Silent or quiet mode. Do not show progress meter or error messages.  
     Makes Curl mute.

  -S/--show-error
     When used with -s it makes curl show an error message if it fails.

  -f/--fail
     (HTTP)  Fail silently (no output at all) on server errors. This is mostly
     done to better enable scripts etc to better deal with failed attempts. In
     normal  cases  when a HTTP server fails to deliver a document, it returns
     an HTML document stating so (which often also describes  why  and  more).
     This flag will prevent curl from outputting that and return error 22.

     This method is not fail-safe and there are occasions where non-successful
     response codes will  slip  through,  especially  when  authentication  is
     involved (response codes 401 and 407).

Por ejemplo:

curl -sSf http://example.org > /dev/null
ahilsend
fuente
3
-sS no generó el mensaje de error por alguna razón. Tuve que agregar -f también. El comando de trabajo correcto parece ser curl -fsS http://example.org > /dev/null. Eso no generará nada cuando no haya nada malo, pero imprimirá el código de estado en los errores, lo cual está bien para mí.
palto
1
Ok, agregado -fpara futuras referencias.
ahilsend
10

Creo que para la forma más simple de verificar si el sitio está vivo, podría usar el siguiente método:

curl -Is http://www.google.com | head -n 1

Esto devolverá HTTP/1.1 200 OK. Si la devolución no coincide con su salida, solicite ayuda.

Raza
fuente
1
Verificar el código de estado probablemente tenga más sentido que las otras propuestas
Dukeatcoding
Me aparece "HTTP / 1.1 302 encontrado".
Camarada Esponja
1
Esto es genial porque va más allá de un ping, lo que me permite verificar si mi sitio se carga correctamente (conexión a mySQL, etc.) y obtener resultados más significativos.
Nathan
8

Necesita la -sbandera (silenciosa), la -fbandera (falla con el código de salida en caso de error) y puede usar la -obandera para redirigir la salida:

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected] 

Este es solo un mal ejemplo para un script cron simple. Normalmente, solo desea recibir un correo si un sitio web no funciona.

jofel
fuente
8

Puede capturar estadísticas de tiempo de red desde el rizo. Las latencias de cada fase en un ciclo de solicitud / respuesta pueden ser útiles para determinar la salud.

$ URL=https://example.com
$ curl "$URL" -s -o /dev/null -w \
> "response_code: %{http_code}\n
> dns_time: %{time_namelookup}
> connect_time: %{time_connect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}
> "
response_code: 200

dns_time: 0.029
connect_time: 0.046
pretransfer_time: 0.203
starttransfer_time: 0.212
total_time: 0.212
Corey Goldberg
fuente
2

Esta forma lo ayudará cuando intente probar el sitio cuando https esté presente:

#!/bin/bash
# put your domain in this var
https=https://www.somewebsite.com

# save the status in some variable 
status=`curl $https -k -s -f -o /dev/null && echo "SUCCESS" || echo "ERROR"`    

# print results (or use it in your scripts)
echo "testing $https=$status"
cristiano
fuente
1

Recientemente me pidieron que inventara algo que actuara más como un latido sofisticado.

for i in `curl -s -L cnn.com |egrep --only-matching "http(s?):\/\/[^ \"\(\)\<\>]*" | uniq` ; do curl -s -I $i 2>/dev/null |head -n 1 | cut -d$' ' -f2; done

O, expandido para un poco más de legibilidad,

for i in $(curl -s -L cnn.com |egrep --only-matching 'http(s?):\/\/[^ \"\(\)\<\>]*' | uniq)
do
    curl -s -I "$i" 2>/dev/null | head -n 1 | cut -d' ' -f2
done

Lo que hice fue curlun sitio web, analizar todos los enlaces del html y luego curllos enlaces analizados, generando solo el código de estado. Luego buscaría códigos de estado http> = 400 para encontrar errores.

elee
fuente
1

Responder:

#!/bin/bash -eu
timeout 3s curl -fIsS http://example.org > /dev/null
# and if you have TLS (https), check if it's about to expire:
true | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -checkend "$((3600*24*20))"

Explicaciones:

  • timeout 3sestablecerá un tiempo de espera de 3 segundos para su solicitud. Contestar más lento se considera "no saludable"
  • curl -fflag fallará temprano, -Smostrará errores, -ssuprimirá la salida normal, -Isolo buscará encabezados HTTP, no el contenido. (Como siempre, hay más detalles disponibles en el man curlcomando).
  • La -checkenddirectiva openssl verifica las fechas de vencimiento de un certificado. En mi ejemplo, son 20 días (especificados en segundos).
VasyaNovikov
fuente
Creo que tiene las explicaciones -sy el -Sintercambio
nafg
1

Curl tiene códigos de estado de salida muy específicos
¿Por qué no solo verificarlos?

#!/bin/bash

##name: site-status.sh

FAIL_CODE=6

check_status(){
    LRED="\033[1;31m" # Light Red
    LGREEN="\033[1;32m" # Light Green
    NC='\033[0m' # No Color


    curl -sf "${1}" > /dev/null

    if [ ! $? = ${FAIL_CODE} ];then
        echo -e "${LGREEN}${1} is online${NC}"
    else
        echo -e "${LRED}${1} is down${NC}"
    fi
}


check_status "${1}"

Uso:

$ site-status.sh example.com

Resultado:

$ example.com is online

Notas:

Este script solo verifica si el sitio puede resolverse.

Este código debería ayudarlo si lo único que le importa es que el sitio esté activo o inactivo.
Sin embargo, si realiza algunos cambios en el bloque if / else, puede probar fácilmente otros códigos de estado si lo desea

Silvernode
fuente