5 Stimmen

Code zum Anpingen von Websites funktioniert manchmal

Ich teste ein Stück Code, um eine Reihe von Websites, die ich besitze, regelmäßig anzupingen, um sicherzugehen, dass sie verfügbar sind.

Ich verwende Rails und bisher habe ich diese hässliche Test-Aktion, die ich verwende, um es auszuprobieren (siehe unten).
Das Problem ist jedoch, dass es manchmal funktioniert und manchmal nicht ... manchmal läuft es durch den Code einfach gut, andere Zeiten, es scheint völlig zu ignorieren, die begin/rescue-Block ...

a. Ich brauche Hilfe, um herauszufinden, was das Problem ist b. Und die Überarbeitung, damit es anständig aussieht.

Wir wissen Ihre Hilfe sehr zu schätzen.

edit 1: Hier ist der aktualisierte Code, sorry, dass es so lange gedauert hat, pastie.org war seit gestern down http://pastie.org/927201

Seine immer noch die gleiche Sache ... Überspringen der begin-Block (weil es nur up_check_time aktualisiert) ... jedoch wenn eine der Seiten Zeiten aus, es tatsächlich aktualisiert alles (check_msg, Code usw.) richtig ... verwirrend, ja?

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

3voto

mikej Punkte 63496

Sie haben derzeit eine leere rescue Block für Errno::EBADF Wenn also diese Ausnahme ausgelöst wird, werden Sie nicht die site.up a false .

Außerdem gibt es noch einige kleinere Verbesserungen:

Anstelle von if site.uri and !site.uri.empty? können Sie verwenden:

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

um diese Iteration der Tabelle zu überspringen each Schleife und vermeiden Sie die Einrückung des Codes um eine zusätzliche Ebene.

Und:

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

kann prägnanter geschrieben werden:

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

Wenn Sie den Code mit einigen dieser Tipps bereinigen, können Sie das Problem möglicherweise eingrenzen.

1voto

Michael Kohl Punkte 64654

Hier ist ein Ausschnitt aus einem meiner Programme, vielleicht hilft es:

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

0voto

mpd Punkte 2160

Das einzige, was ich mir vorstellen kann, ist, dass Sie eine andere Ausnahme in Ihrem Begin-Block erhalten. Da Sie nur explizit Errno::EBADF, Timeout::Error retten, scheint es, dass Ihr Anfang und Rettung übersprungen wurde. Sie können dies vielleicht überprüfen, indem Sie Errno::EBADF, Timeout::Error loswerden und nur eine einfache Rettung haben.

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

Schauen Sie dann in Ihren Protokollen nach, welche Ausnahmen Sie erhalten.

0voto

Phill Pafford Punkte 80621

Wenn Sie Ihre Server überwachen, warum verwenden Sie nicht Nagios ? es ist kostenlos und bietet auch etwas Ruby-Unterstützung, Aquí y Aquí .

EDITです:

Ruby GEM: http://hobodave.com/2010/01/10/simple-nagios-probes-in-ruby/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X