如何自动启动Rails延迟工作?

时间:2012-03-02 22:56:12

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

我正在使用delayed job创建作业队列,例如“邮件程序”

为此,我必须运行:

$ RAILS_ENV=development QUEUE=mailer rake jobs:work

但是如果服务器崩溃并重新启动,我需要工作人员自动重新开始运行。

建议的解决方法是什么?

5 个答案:

答案 0 :(得分:1)

您需要使用monit / bluepill / god / upstart等第三方服务来监视进程并重新启动它。我建议使用foreman和upstart的组合。见这里:http://blog.daviddollar.org/2011/05/06/introducing-foreman.html

答案 1 :(得分:0)

前段时间我为DelayedJob写了一个patch来重新加载开发模式中每个作业的类。同样的补丁也适用于您的要求。

答案 2 :(得分:0)

如果您有这样的监控工具,那么betamatt的方法绝对是一种方法。

另一种方法是将脚本添加到操作系统的启动程序中,该启动程序在具有必要权限的用户下运行RAILS_ENV=development QUEUE=mailer rake jobs:work命令。

以下是如何在Ubuntu using Upstart上执行此操作的示例,但如果您查找类似的init.d方法,或者与服务器操作系统相关的任何方法,您将找到其他方法。您正在寻找的是“如何在启动时运行脚本[您的操作系统名称]”,然后将命令包装在可执行脚本中。

答案 3 :(得分:0)

我的申请正在处理同样的问题。所以我写了一个每分钟都运行的rake任务(作为一个cron工作)。延迟作业启动时,它将在临时文件夹中创建一个.pid文件。我用这个来检查是否存在延迟的工作流程。如果文件不存在,我通过代码运行控制台命令。

delayed_job_status = File.file?(“./ tmp / pids / delayed_job.pid”)

  • 这将检查进程的存在。如果nil响应转到下一个声明

./bundle exec script/delayed_job start production

  • 这将开始延迟工作

答案 4 :(得分:0)


我的解决方案是在用户家中创建bash脚本
" delayed_job_startup.sh"
其中包含

    #!/bin/bash
    cd /home/deploy/project/current/
    RAILS_ENV=production bin/delayed_job start

并在文件/etc/rc.local中我从我的用户

运行此脚本
    su -s /bin/bash - deploy /home/deploy/delayed_job_startup.sh