Как перезапустить Resque работников автоматически при перезапуске сервера Redis - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть приложение Rails, которое запускает задания в фоновом режиме с помощью адаптера Resque. Я заметил, что раз в пару дней мои работники исчезают (просто останавливаются), мои работы застряли в очереди, и мне приходится перезапускать работников каждый раз, когда они останавливаются.

Я проверяю, используя ps -e -o pid,command | grep [r]esque, и запускаю рабочих в фоновом режиме, используя (RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes bundle exec rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log.

Затем я остановил редис-сервер с помощью /etc/init.d/redis-server stop и снова проверил рабочие процессы. Они исчезли

Это дает основание полагать, что рабочие процессы могут быть остановлены, возможно, из-за перезапуска сервера redis по какой-то причине.

Есть ли способ решения этой проблемы с помощью Rails / Ruby? Мне приходит в голову написать простой код Ruby, который будет наблюдать за рабочими процессами с периодом, скажем, 5 секунд, и перезапускать их, если они остановятся.

UPDATE: Я не хочу использовать такие инструменты, как Monit, God, eye и т. Д. Они ненадежны. Тогда мне нужно будет их тоже посмотреть. Что-то вроде установки Бога для управления работниками Resque, затем установки Monit для наблюдения за Богом, ...

UPDTAE Это то, что я использую, и это действительно работает. Я вручную остановил редис-сервер и снова запустил его. Этот скрипт успешно запущен рабочими.

require 'logger'

module Watch

  def self.workers_dead?
   processes = `ps -e -o pid,command | grep [r]esque`
   return true if processes.empty?
   false
  end

  def self.check(time_interval)
   logger = Logger.new('watch.log', 'daily')
   logger.info("Starting watch")

   while(true) do
     if workers_dead?
       logger.warn("Workers are dead")
       restart_workers(logger)
     end
     sleep(time_interval)
   end
  end

  def self.restart_workers(logger)
   logger.info("Restarting workers...")
   `cd /var/www/agts-api && (RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log`
  end

end

Process.daemon(true,true)
pid_file = File.dirname(__FILE__) + "#{__FILE__}.pid"
File.open(pid_file, 'w') { |f| f.write Process.pid }
Watch.check 10

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

Вы могли бы сделать это намного проще. Запустите Resque на переднем плане. Когда он выйдет, запустите его снова. Нет pid файлов, нет мониторинга, нет сна.

require 'logger'

class Restarter
  def initialize(cmd:, logger: Logger.new(STDOUT))
    @cmd = cmd
    @logger = logger
  end

  def start
    loop do
      @logger.info("Starting #{@cmd}")
      system(@cmd)
      @logger.warn("Process exited: #{@cmd}")
    end
  end
end

restarter = Restarter.new(
  cmd: 'cd /var/www/agts-api && (RAILS_ENV=production rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log',
  logger: Logger.new('watch.log', 'daily')
)
restarter.start

0 голосов
/ 07 сентября 2018

Вы можете использовать инструменты мониторинга процессов, такие как monit, god, eye и т. Д. Эти инструменты могут проверять восстановление PID и использование памяти в указанный вами промежуток времени. У вас также есть возможность перезапустить фоновые процессы, если предел памяти превышает ваши ожидания. Лично я использую драгоценный камень для глаз.

...