在启动时启动延迟作业

Posted

技术标签:

【中文标题】在启动时启动延迟作业【英文标题】:Starting delayed_job at startup 【发布时间】:2010-12-15 17:04:24 【问题描述】:

我正在使用带 capistrano 的delayed_job,并且想要一种在Web 应用程序启动时使用'script/delayed_job start' 来启动delayed_job 的方法。这样 capistrano 可以在部署时重新启动它。如果服务器重新启动,那么我的延迟作业应该与项目一起启动。

我该怎么做? 我应该考虑在环境文件中执行此操作还是作为初始化程序?

【问题讨论】:

【参考方案1】:

结合 capistrano 重启配方,使用 cron 在启动时使用特殊的 @reboot 时间在 crontab 中启动 delay_job 守护程序非常方便:

@reboot /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production script/delayed_job restart'

和whenever一起配置定时任务更加方便:

job_type :envcommand, 'cd :path && RAILS_ENV=:environment :task'

every :reboot do
  envcommand 'script/delayed_job restart'
end

不确定 cron 的所有实现是否实际上只在系统启动时运行 @reboot,但至少 Ubuntu 接缝只在启动时运行它们,而不是在 cron 守护程序启动或重新启动时运行。如果您将restart 传递给script/delayed_job,它可能在任何一种情况下都可以工作。

【讨论】:

这是最简单的解决方案。在 Ubuntu 12.04 上工作得很好。喜欢 crontab。【参考方案2】:

您应该使用重启命令创建一个配方。

namespace :delayed_job do 
    desc "Restart the delayed_job process"
    task :restart, :roles => :app do
        run "cd #current_path; RAILS_ENV=#rails_env script/delayed_job restart"
    end
end

然后添加它以在部署结束时执行。

after "deploy:update_code", "delayed_job:restart"

【讨论】:

我已经在我的 capistrano 中找到了这个食谱并且它正在工作。我的问题更多与重新启动服务器有关。目前我已经完成了一项工作,在启动时我只是在我的 init.d 中运行一个脚本并启动 delay_job 守护进程。不过,将它作为我的应用程序的一部分会很好。 您可以使用god来管理进程并在机器启动时自动启动它。 delayed_job 有它自己的 recipes.rb 文件,它几乎与上面的任务完全一样,加上delayed_job:start 和delayed_job:stop 任务。 嗨@Ryan:我也注意到了这一点,但我不知道如何在我的deploy.rb 中包含/要求这些内容。只是 require delayed_job'` 对我不起作用(我正在使用来自 git 的版本)。 使用 rails 3 我发现在 require 'delayed_job/recipes' 之前我需要在 deploy.rb 中做 require 'bundler/setup'【参考方案3】:

这个问题有点晚了,但delayed_job 2.1.4 版有capistrano 食谱:

https://github.com/collectiveidea/delayed_job/wiki/Rails-3-and-Capistrano

这是 Damien Mathieu 的回答,但已经是 delay_job gem 的一部分。

【讨论】:

【参考方案4】:

这现在适用于 Rails 2 和 3:

在 deploy.rb 中,添加以下行:

require "delayed/recipes"
set :rails_env, 'production' #added for delayed_job
before "deploy:restart", "delayed_job:stop"
after  "deploy:restart", "delayed_job:start"
after "deploy:stop",  "delayed_job:stop"
after "deploy:start", "delayed_job:start"

【讨论】:

【参考方案5】:

可以使用monit启动和监控delayed_job:How to monitor delayed_job with monit

【讨论】:

以上是关于在启动时启动延迟作业的主要内容,如果未能解决你的问题,请参考以下文章

rspec 中未处理延迟作业

禁用 Spring Batch 作业

使用作为守护任务运行的延迟作业部署 Rails 应用程序

Linux作业管理

计划的作业未启动

Spark:作业重启和重试