我有一个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
答案 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