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

问题描述 投票:0回答:1

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

这使得有理由认为工作进程因为某些原因而重新启动而停止工作进程。

是否有任何Rails / Ruby方式解决这个问题?我想到的是编写一个简单的Ruby代码,该代码将使用句点(例如5秒)观察工作进程,如果它们停止则重新启动它们。

更新:我不想使用诸如Monit,God,eye等工具。它们不可靠。然后我也需要看他们。喜欢安装上帝来管理Resque工作人员,然后安装Monit来观看上帝,......

更新这是我正在使用的,它确实有效。我手动停止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
ruby-on-rails ruby redis resque rails-activejob
1个回答
1
投票

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

热门问题
推荐问题
最新问题