2017-03-20 66 views
-1

所以我有一個腳本,每分鐘檢查一次HTTP狀態,如果它不是200(OK),我會發一封電子郵件說有些事情出現了。問題是如何發送電子郵件一次直到狀態發生變化(然後再發送一封電子郵件)。隨着循環的進行,我不想每分鐘都發一次垃圾郵件。謝謝。在循環中做一件事

這裏是我的循環:

loop do 
    if foo_response_status == false || bar_response_status == false 
    send_email 
    end 

    puts foo_response_status.kind_of? Net::HTTPSuccess 
    puts bar_response_status.kind_of? Net::HTTPSuccess 
    puts Time.now 

    sleep 60 
end 
+1

在循環外部保留一個狀態變量,告訴您何時服務已知被關閉。 – meagar

+1

也許創建一個標誌,表示電子郵件已經發送 – redxef

回答

1

通過使用在循環外聲明的變量,可以跟蹤以前的狀態。該代碼檢查new_status和old_status是否相同;如果是這樣,它使用continue跳過循環中的其餘代碼。

old_status = false 
loop do 
    new_status = foo_response_status == false || bar_response_status == false 

    next if new_status == old_status 

    send_email if new_status == false 

    old_status = new_status 

    puts foo_response_status.kind_of? Net::HTTPSuccess 
    puts bar_response_status.kind_of? Net::HTTPSuccess 
    puts Time.now 

    sleep 60 
end 
+0

這就是解決方案,簡潔易懂。謝謝。 – r0uder

+3

Ehm ... Ruby中沒有'continue'。也許你的意思是「下一個」。 – steenslag

+0

想通了,謝謝:) – r0uder

0

使用break

loop do 
    if condition === true 
    break 
    end 
end 

這將導致循環退出循環。

在你的情況下,它會像

if foo_response_status == false || bar_response_status == false 
    send_email 
    break 
end 

發送電子郵件後,這將停止循環。請注意,如果腳本被重新執行(例如,在cron中),這不會阻止循環再次運行(例如,在cron中)。

+0

這些也可以用'until'來寫。 –

+0

謝謝你的回答,這非常有幫助。 @eiko給出了一個實際的解決方案。 – r0uder