如何自动启动Rails延迟的作业



我正在使用延迟作业来创建作业队列,如"mailer"

为了这个工作,我必须运行这个:

$ RAILS_ENV=development QUEUE=mailer rake jobs:work

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

建议如何处理此问题?

您需要使用第三方服务,如monit/bluepillgod/upstart来监视流程并重新启动。我建议使用foreman和upstart的组合。请参见此处:http://blog.daviddollar.org/2011/05/06/introducing-foreman.html

不久前,我为DelayedJob编写了一个补丁,以便在开发模式下为每个作业重新加载类。同样的补丁也应该适用于您的需求。

betamatt的方法无疑是实现这一目标的一种方法,如果您有这样的监控工具的话。

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

这里有一个如何使用Upstart在Ubuntu上实现这一点的例子,但如果你查找类似的init.d方法,或者任何与你的服务器操作系统相关的方法,你会找到其他方法。基本上,您要寻找的是"如何在启动时运行脚本[您的操作系统名称]",然后将您的命令封装在可执行脚本中。

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

delayed_job_status=文件?("./tmp/pids/delayed_job.pid")

  • 这将检查进程的存在。如果没有回应,转到下一个语句

./bundle exec script/delayed_job start production

  • 这将启动延迟作业


我的解决方案是在用户的主页中创建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

最新更新