код для пинга сайтов иногда работает - PullRequest
5 голосов
/ 20 апреля 2010

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

Я использую рельсы, и пока у меня есть это отвратительное тестовое действие, которое я использую, чтобы попробовать его (см. Ниже).
Проблема, однако, в том, что иногда это работает, а иногда нет ... иногда он проходит через код просто отлично, в других случаях кажется, что он полностью игнорирует блок begin / rescue ...

а. Мне нужна помощь, чтобы выяснить, в чем проблема б. И рефакторинг, чтобы он выглядел респектабельно.

Ваша помощь очень ценится.

edit 1: Вот обновленный код, извините, что так долго, pastie.org со вчерашнего дня не работает http://pastie.org/927201

Он все еще делает то же самое ... пропуская блок начала (потому что он только обновляет up_check_time) ... однако, если один из сайтов отключается, он фактически обновляет все (check_msg, код и т. Д.) Правильно ... сбивает с толку , да?

require 'net/http'
require 'uri'

def ping
    @sites = NewsSource.all

    @sites.each do |site|
        if site.uri and !site.uri.empty?
            uri = URI.parse(site.uri)
            response = nil
            path = uri.path.blank? ? '/' : uri.path
            path = uri.query.blank? ? path : "#{path}?#{uri.query}"

            begin
                Net::HTTP.start(uri.host, uri.port) {|http|
                http.open_timeout = 30
                http.read_timeout = 30
                response = http.head(path)
                }

                if response.code.eql?('200') or response.code.eql?('301') or response.code.eql?('302')
                site.up = true
                else
                site.up = false
                end

                site.up_check_msg = response.message
                site.up_check_code = response.code
            rescue Errno::EBADF
            rescue Timeout::Error
                site.up = false
                site.up_check_msg = 'timeout'
                site.up_check_code = '408'
            end
            site.up_check_time = 0.seconds.ago
            site.save
        end
    end
end

Ответы [ 4 ]

3 голосов
/ 20 апреля 2010

В настоящее время у вас есть пустой блок rescue для Errno::EBADF, поэтому, если возникнет это исключение, вы не будете устанавливать site.up в false.

Также, пара других мелких улучшений:

Вместо if site.uri and !site.uri.empty? вы можете использовать:

next if site.uri.nil? or site.uri.empty?

чтобы пропустить эту итерацию цикла each и избежать отступа кода на дополнительном уровне.

И

if response.code.eql?('200') or response.code.eql?('301') or response.code.eql?('302')
  site.up = true
else
  site.up = false
end

можно написать более кратко:

site.up = ['200', '301', '302'].include? response.code

Если вы приведете код в соответствие с некоторыми из этих советов, это может помочь сузить проблему.

1 голос
/ 20 апреля 2010

Вот фрагмент одной из моих программ, может быть, это поможет:

urls.each_with_index do |url, idx|
  print "Processing URL #%04d: " % (idx+1)
  uri = URI.parse(url)
  response = nil

  begin
    Net::HTTP.start(uri.host, uri.port) do |http|
      response = http.head(uri.path.size > 0 ? uri.path : "/")
    end
  rescue => e
    puts "#{e.message} - #{url}"
    next
  end

  # handle redirects
  if response.is_a?(Net::HTTPRedirection)
    new_uri = URI.parse(response['location'])
    puts "URI redirects to #{new_uri}"
    next
  end

  puts case response.code
    when '200' then ...
    when '404' then ...
    else ...
  end
end
0 голосов
/ 29 апреля 2010

Если вы отслеживаете свои серверы, почему бы не использовать Nagios ? он бесплатный, а также имеет некоторую поддержку Ruby, Здесь и Здесь .

EDIT:

Рубин GEM: http://hobodave.com/2010/01/10/simple-nagios-probes-in-ruby/

0 голосов
/ 23 апреля 2010

Единственное, о чем я могу подумать, это то, что вы получаете какое-то другое исключение в своем блоке начала. Поскольку вы только явно спасаете Errno :: EBADF, Timeout :: Error, может показаться, что ваше начало и спасение пропущены. Вы можете убедиться в этом, избавившись от Errno :: EBADF, Timeout :: Error и просто выполнив простое восстановление, а затем вставьте следующее в свой блок восстановления

logger.info(">>Exception was: "+$!)

Затем посмотрите в своих логах, какие исключения вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...