【发布时间】:2012-03-21 10:36:30
【问题描述】:
我正在使用delayed job 创建作业队列,例如“邮件程序”
为此,我必须运行它:
$ RAILS_ENV=development QUEUE=mailer rake jobs:work
但是如果服务器崩溃并重新启动,我需要worker自动重新开始运行。
推荐的处理方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 delayed-job
我正在使用delayed job 创建作业队列,例如“邮件程序”
为此,我必须运行它:
$ RAILS_ENV=development QUEUE=mailer rake jobs:work
但是如果服务器崩溃并重新启动,我需要worker自动重新开始运行。
推荐的处理方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 delayed-job
您需要使用第三方服务如monit/bluepill/god/upstart 来观察进程并重新启动它。我建议使用工头和新贵的组合。见这里:http://blog.daviddollar.org/2011/05/06/introducing-foreman.html
【讨论】:
前段时间,我为 DelayedJob 写了一个patch,以便在开发模式下为每个作业重新加载类。同样的补丁也应该可以满足您的要求。
【讨论】:
HappyDeveloper 想要在开发模式下运行他的服务器和工作人员时工作。在开发模式下,补丁会为每个请求重新加载类。
如果您有这样的监控工具,betamatt 的方法绝对是一种方法。
另一种方法是将脚本添加到操作系统的启动中,该脚本在具有必要权限的用户下运行RAILS_ENV=development QUEUE=mailer rake jobs:work 命令。
这是一个如何在Ubuntu using Upstart 上执行此操作的示例,但是如果您查找类似的init.d 方法,或者与您的服务器操作系统相关的任何方法,您会找到其他方法。基本上,您要查找的是“如何在启动时运行脚本 [您的操作系统名称]”,然后将您的命令包装在可执行脚本中。
【讨论】:
我的应用程序遇到了同样的问题。所以我写了一个每分钟运行的 rake 任务(作为 cron 作业)。当延迟作业开始时,它将在临时文件夹中创建一个 .pid 文件。我用它来检查是否存在延迟的作业流程。如果文件不存在,我通过代码运行控制台命令。
delayed_job_status = File.file?("./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
【讨论】: