2010-04-20 54 views
5

我測試了一段代碼,以ping我定期的一堆網站,以確保他們起來。代碼ping網站有時工作

我正在使用rails並且到目前爲止我有這個可怕的測試操作,我正在試用它(請參閱下文)。
雖然問題是,有時它有效,有時它不會......有時候它通過代碼運行得很好,其他時候,它似乎完全忽略了開始/救援塊...

a。我需要幫助弄清楚問題是什麼 b。並重構這使它看起來很可敬。

非常感謝您的幫助。

編輯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 

回答

1

下面是從我的節目之一的片段,也許它可以幫助:

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

您目前有Errno::EBADFrescue塊,如果引發異常,那麼你將不會設置site.upfalse

此外,一對夫婦的其他小改進:

相反的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 

如果您整理了一些這些提示的代碼,那麼它可能會幫助縮小問題。

+0

NICE! 編輯...會稍微轉貼,但我還有一個問題?是否有可能一次拯救多個例外......這就是我試圖(笨拙地)用救援塊來做的事情...... – concept47 2010-04-20 09:34:57

+0

是的,我想你可能一直試圖拯救多個例外。我只是不確定。要做到這一點,用逗號分隔它們。 '救援Errno :: EBADF,超時::錯誤' – mikej 2010-04-20 10:03:03

+0

感謝邁克,我昨天通過查看Ruby案例陳述是如何做到的,但是無論如何感謝:D。這是更新的代碼... http://pastie.org/927201。它仍然做同樣的事情...跳過開始塊(我說,因爲它通常只會更新up_check_time)...但是,如果其中一個網站超時,它實際上會正確更新所有內容(check_msg,代碼等)......令人困惑,是嗎? – concept47 2010-04-21 02:40:44

0

我能想到的唯一的事情就是你在開始塊中得到了一些其他異常。由於您只是明確地拯救Errno :: EBADF,Timeout :: Error,因此您的開始和救援似乎會被跳過。您可能能夠通過擺脫errno的:: EBADF,超時::錯誤,只是有一個普通的救援,以驗證這一點,然後把下面的在你的救援塊

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

然後看看你的日誌,看看你有什麼例外。

0

如果您正在監視您的服務器,爲什麼不使用Nagios?它是免費的,也有一些Ruby支持,HereHere

編輯:

紅寶石創業板:http://hobodave.com/2010/01/10/simple-nagios-probes-in-ruby/

+0

將無法​​正常工作,因爲我需要它從rails應用程序本身執行此操作 – concept47 2010-05-03 15:40:55

+0

Ruby鏈接沒有提供此功能嗎? – 2010-05-06 13:33:21

+0

我不在監視服務器,我正在嘗試查看外部網站是否正在使用頭部命令。就我所見,這個解決方案對我沒有任何幫助。 – concept47 2010-05-06 19:14:15

相關問題