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