【发布时间】:2019-02-12 17:41:48
【问题描述】:
我有一个使用 Resque 适配器在后台运行作业的 Rails 应用程序。我注意到有几天我的工人消失了(只是停止),我的工作卡在队列中,每次停止时我都必须重新启动工人。
我使用 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、God、eye等工具。它们不可靠。然后我也需要看他们。就像安装上帝来管理 Resque 工人,然后安装 Monit 来监视上帝,......
UPDTAE 这就是我正在使用的,它确实有效。我手动停止了 redis-server,然后再次启动它。该脚本成功启动了worker。
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 的东西
-
我会检查日志 (
log/resque.log) 并查看问题所在,或者您可以在前台启动 resque worker 以进行调试。要运行像 resque 这样的排队系统,我会设置一个进程管理工具,比如其中一个:github.com/kostya/eye、digitalocean.com/community/tutorials/… -
可以使用monit、god、eye等进程监控工具,我个人使用eye gem。
-
@siegy22 我有 rake 重定向输出到
log/resque.log所以,当然,我确实查看了这个文件,希望它对找出工人停止的原因有用。不幸的是,它有几行不知道工人为什么停下来。至于管理工具,我不喜欢这个想法。它们增加了额外的复杂性,并且无法保证它们不会经常崩溃或正常工作。 -
如果你在 linux 上,我强烈建议使用 systemd,例如,它更容易处理自动启动。在过去的几年里,我一直在使用 eye,它一直对我很有帮助,它非常容易配置,因为它只是普通的 ol' ruby
标签: ruby-on-rails ruby redis resque rails-activejob