Перевірка здоров'я веб-сторінки за допомогою curl


34

Я хотів би зробити перевірку стану здоров’я служби, зателефонувавши на конкретну URL-адресу. Здається, найпростішим рішенням буде використовувати cron для перевірки щохвилини або близько того. У разі помилок, cron надсилає мені електронний лист.

Я спробував використовувати cUrl для цього, але не можу змусити його виводити повідомлення лише на помилках. Якщо я спробую направити вихід на / dev / null, він виводить звіт про хід роботи.

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

Я спробував розглянути варіанти завивки, але я просто не можу знайти нічого, що підходить для ситуації, коли ви хочете, щоб він мовчав на успіх, але шумів на помилках.

Чи є спосіб змусити завиток робити те, що я хочу, чи є якийсь інший інструмент, на який я повинен дивитись?


2
Як щодо використання icingaабо будь-якої іншої системи моніторингу?
Стефан Шазелас

Я використовую це для хобі-проекту з обмеженими ресурсами на спільному хості. Я хотів би використовувати систему моніторингу інакше. Спасибі за пораду все одно, я раніше не чув про іклінгу
пальто

Я хотів би зазначити, що постачальники хостингових акцій на це нахмуряться, якщо ви надто часто перейдете на всі сторінки вашого акаунта. Зазвичай постачальники мають одночасні обмеження процесу та максимальні часові обмеження. Також цей метод не буде точним, якщо між вами та постійним струмом постачальника буде відключення мережі. Вам слід дослідити журнали доступу до домену у вашому спільному обліковому записі. Зазвичай багатий трафік від ботів і просто випадкових відвідувачів, що дасть вам дуже гарне уявлення про доступність вашого веб-сайту.
rcjohnson

Відповіді:


39

Про що -sSf? З чоловічої сторінки:

  -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).

Наприклад:

curl -sSf http://example.org > /dev/null

3
-sS чомусь не вивів повідомлення про помилку. Мені довелося також додати -f. Правильна робоча команда, здається, є curl -fsS http://example.org > /dev/null. Це не призведе до того, що нічого не вийде, але він надрукує код статусу на помилках, що мені добре.
palto

1
Добре, додано -fдля подальших посилань.
ахільсенд

10

Я думаю, що для найпростішого способу перевірити, чи сайт живий, ви можете скористатися наступним методом:

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

Це повернеться HTTP/1.1 200 OK. Якщо повернення не відповідає вашому результату, тоді телефонуйте за допомогою.


1
Перевірка коду статусу має певно сенс, як і інші пропозиції
Dukeatcoding

Я отримую "HTTP / 1.1 302 знайдено".
Губчатий товариш

1
Це чудово, оскільки воно виходить за рамки ping, що дозволяє мені перевірити, чи правильно завантажується мій сайт (підключення до mySQL тощо) та отримати більш значущі результати.
Натан

8

Вам потрібен -sпрапор (беззвучний), -fпрапор (невдача з кодом виходу при помилці) і ви можете використовувати -oпрапор для перенаправлення виводу:

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" admin@thesite.com 

Це лише поганий приклад для простого сценарію cron. Зазвичай ви хочете отримати лише одну пошту, якщо веб-сайт не працює.


8

ви можете зафіксувати статистику мережевих синхронізацій від завитка. затримки кожної фази в циклі запит / відповідь можуть бути корисними для визначення стану здоров'я.

$ 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

2

Цей спосіб допоможе вам при спробі протестувати сайт при наявності https:

#!/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"

1

Нещодавно мене попросили придумати щось, що б більше нагадувало витончене серцебиття.

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

Або розширений для трохи читабельності,

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

Що я зробив, curlце веб-сайт, який розбирав усі посилання з html, а потім curlті, які аналізували посилання, виводячи лише код статусу. Тоді я б шукав коди статусу http> = 400, щоб знайти помилки.


1

Відповідь:

#!/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))"

Пояснення:

  • timeout 3sвстановить тривалісний тайм-аут для вашого запиту. Відповідь повільніше вважається "не здоровою"
  • -fпрапор згортання не вдасться рано, -Sпокаже помилки, -sпридушить нормальний вихід, -Iотримає лише заголовки HTTP, а не вміст. (Як завжди, більш детальна інформація доступна в man curlкоманді.)
  • -checkendДиректива openssl перевіряє терміни придатності сертифіката. У моєму прикладі це 20 днів (вказано в секундах).

Я думаю, ви маєте пояснення -sта -Sпоміняли місцями
nafg

1

У Curl є дуже конкретні коди статусу виходу
Чому б не просто перевірити їх?

#!/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}"

Використання:

$ site-status.sh example.com

Результат:

$ example.com is online

Примітки:

Цей скрипт перевіряє, чи сайт може бути вирішений.

Цей код повинен отримати вас, якщо все, що вам цікаво, - це веб-сайт вгору або вниз.
Однак якщо ви внесете кілька змін до блоку if / else, ви можете легко перевірити наявність інших кодів статусу, якщо бажаєте

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.