Проверка работоспособности веб-страницы с помощью curl


34

Я хотел бы проверить работоспособность службы, позвонив по конкретной ссылке. Похоже, самое простое решение - использовать 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

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

Есть ли способ заставить curl делать то, что я хочу, или есть какой-то другой инструмент, на который я должен обратить внимание?


2
Как насчет использования icingaили любой другой системы мониторинга?
Стефан Шазелас

Я использую это в хобби-проекте с ограниченными ресурсами на общем хосте. Я хотел бы использовать систему мониторинга в противном случае. В любом случае, спасибо за совет, я не слышал об исинге раньше
palto

Я хотел бы отметить, что провайдеры общего хостинга не одобрят это, если вы слишком часто заходите на все страницы своей учетной записи. Поставщики, как правило, имеют ограничения по одновременным процессам и ограничения по максимальному времени исполнения. Также этот метод не будет точным, если между вами и DC провайдера есть сбой в сети. Вам следует изучить журналы доступа к домену в вашей общей учетной записи. Обычно есть много трафика от ботов и просто случайных посетителей, которые дадут вам очень хорошее представление о том, насколько доступен ваш сайт.
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. Это ничего не выдаст, когда ничего плохого, но он напечатает код состояния при ошибках, что меня устраивает.
Пальто

1
Хорошо, добавлено -fдля будущих ссылок.
Ахилсенд

10

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

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

Это вернется HTTP/1.1 200 OK. Если результат не соответствует вашему выводу, обратитесь за помощью.


1
Проверка кода состояния, вероятно, более
логична,

Я получаю "HTTP / 1.1 302 найдено".
Губка Товарищ

1
Это здорово, потому что это выходит за рамки пинга, позволяя мне проверить, правильно ли загружается мой сайт (подключение к 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

Вы можете захватить статистику синхронизации по сети от curl. Задержки каждой фазы в цикле запроса / ответа могут быть полезны для определения работоспособности.

$ 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установит 3-секундный таймаут для вашего запроса. Ответ медленнее считается "не здоровым"
  • -fфлаг curl рано не будет установлен, -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.