2010-04-20 21 views
5

Estoy probando un fragmento de código para hacer ping a un grupo de sitios web que poseo regularmente, para asegurarme de que estén activos.código para hacer ping a sitios web funciona a veces

Estoy usando raíles y hasta ahora tengo esta acción de prueba horrible que estoy utilizando para probarlo (ver a continuación).
El problema, sin embargo, es que a veces funciona, y otras veces no ... a veces funciona perfectamente con el código, otras veces parece ignorar por completo el bloque de inicio/rescate ...

a. Necesito ayuda para averiguar cuál es el problema b. Y refacturando esto para que se vea respetable.

Su ayuda es muy apreciada.

edición 1: Aquí está el código actualizado, siento haber tardado tanto, pastie.org se redujo desde ayer http://pastie.org/927201

Su todavía haciendo lo mismo ... sin esperar bloque begin (ya que sólo actualizaciones up_check_time) ... sin embargo, si uno de los sitios se agota, realmente actualiza todo (check_msg, código, etc.) correctamente ... confuso, ¿sí?

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 

Respuesta

1

He aquí un fragmento de uno de mis programas, tal vez ayuda a:

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 
3

Actualmente tiene un bloque vacío rescue para Errno::EBADF por lo que si esa excepción se eleva entonces no va a ser el establecimiento de site.up a false.

Además, un par de otras mejoras menores:

En lugar de if site.uri and !site.uri.empty? puede utilizar:

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

para saltar esa iteración del bucle each y evitar la sangría del código por un nivel adicional.

Y:

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

puede escribirse más concisamente:

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

Si poner en orden el código con algunos de estos consejos, entonces puede ayudar a reducir el problema.

+0

AGRADABLE !!! Las ediciones ... volverán a publicarse un poco, pero tengo una pregunta más? ¿Es posible rescatar múltiples excepciones a la vez? Eso es lo que estaba tratando de hacer (torpemente) con los bloques de rescate ... – concept47

+0

Sí, pensé que podría haber estado tratando de rescatar múltiples excepciones a la vez. Simplemente no estaba seguro. Para hacerlo, sepáralos con una coma, p. 'rescatar a Errno :: EBADF, Timeout :: Error' – mikej

+0

Gracias, Mike, lo descubrí ayer al ver cómo lo hicieron las declaraciones de casos de Ruby, pero gracias de todos modos: D. Aquí está el código actualizado ... http://pastie.org/927201. Sigue haciendo lo mismo ... omitiendo el bloque begin (lo digo porque generalmente solo actualiza up_check_time) ... sin embargo, si uno de los sitios se agota, realmente actualiza todo (check_msg, código, etc.) correctamente ... confuso, ¿sí? – concept47

0

Lo único que se me ocurre es que está obteniendo alguna otra excepción en su bloque begin. Como solo está rescatando explícitamente Errno :: EBADF, Timeout :: Error, parece que se salteó su inicio y rescate. Usted puede ser capaz de verificar esto mediante la eliminación de Errno :: EBADF, Tiempo de espera :: error y sólo tener un rescate sin formato, a continuación, poner lo siguiente en su bloque de rescate

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

A continuación, busque en sus registros para ver qué excepciones estás recibiendo

0

Si está monitoreando sus servidores ¿por qué no usar Nagios? es gratis y también tiene soporte de Ruby, Here y Here.

EDIT:

gema de rubíes: http://hobodave.com/2010/01/10/simple-nagios-probes-in-ruby/

+0

no funcionará porque lo necesito desde dentro de la aplicación de rieles – concept47

+0

¿Ruby Links no ofreció esto? –

+0

No estoy monitoreando los servidores, estoy tratando de ver si los sitios web externos están funcionando usando un comando principal. Esta solución no hace nada por mí hasta donde puedo ver. – concept47

Cuestiones relacionadas