循环做一次

时间:2017-03-20 18:53:22

标签: ruby

所以我有一个脚本每分钟检查一次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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用break

loop do
  if condition === true
    break
  end
end

这将导致循环退出循环。

在你的情况下,它会像

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

这将在发送电子邮件后停止循环。注意,如果重新执行脚本(例如,在cron中),这不会阻止循环再次运行