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

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

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

【问题讨论】:

    标签: ruby-on-rails capistrano delayed-job


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-21
          • 2011-03-24
          • 2017-02-04
          • 1970-01-01
          • 2012-08-19
          • 2021-12-30
          • 1970-01-01
          相关资源
          最近更新 更多