Redis服务器重新启动时如何自动重新启动Resque worker

时间:2018-09-07 11:10:44

标签: ruby-on-rails ruby redis resque rails-activejob

我有一个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-server,并再次检查了工作进程。他们不见了。

这有理由认为工作进程停止,可能是由于redis服务器由于某种原因而重新启动了。

是否有Rails / Ruby方式解决此问题?我想到的是编写一个简单的Ruby代码,该代码将监视工作进程的时间(例如5秒),如果停止则重新启动它们。

更新: 我不想使用Monit,上帝,眼睛等工具。它们不可靠。然后,我也需要观看它们。例如,要安装上帝来管理Resque工人,然后安装Monit来监视上帝,……

UPDTAE 这就是我正在使用的并且确实有效。我手动停止了redis-server,然后再次启动它。该脚本成功启动了工作进程。

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 :(得分:1)

您可以使用进程监视工具,例如monit,上帝,眼睛等。这些工具可以按您指定的时间间隔检查resque PID和内存使用情况。如果内存限制超出您的指定期望,您还可以选择重新启动后台进程。我个人使用的是宝石。

答案 1 :(得分:0)

您可以轻松得多。在前台启动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