Итак, у меня есть скрипт, который проверяет HTTP-статус каждую минуту, если он не равен 200 (ОК), я отправлю электронное письмо с сообщением, что что-то пришло. Проблема в том, как можно отправить электронное письмо только один раз, пока статус не изменится (а затем отправить электронное письмо еще раз). Я не хочу спамить каждую минуту, пока идет цикл. Спасибо.

Вот мой цикл:

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
r0uder 20 Мар 2017 в 21:53

2 ответа

Лучший ответ

Используя переменную, объявленную вне цикла, вы можете отслеживать предыдущее состояние. Этот код проверяет, совпадают ли 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
Wes Foster 20 Мар 2017 в 19:13

Используйте break

loop do
  if condition === true
    break
  end
end

Это заставит цикл выйти из цикла.

В вашем случае это было бы что-то вроде

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

Это остановит цикл после отправки электронного письма. Обратите внимание, что это не помешает повторному запуску цикла, если скрипт будет выполнен повторно (например, в cron)

0
Wes Foster 20 Мар 2017 в 18:56