我正在使用Delayed Job来创建任务队列,例如'mailer'
为了使它正常工作,我必须运行以下命令:
$ RAILS_ENV=development QUEUE=mailer rake jobs:work
如果服务器崩溃并重新启动,我需要工作线程自动重新开始运行。
应该如何处理才是推荐的方式呢?
我正在使用Delayed Job来创建任务队列,例如'mailer'
为了使它正常工作,我必须运行以下命令:
$ RAILS_ENV=development QUEUE=mailer rake jobs:work
如果服务器崩溃并重新启动,我需要工作线程自动重新开始运行。
应该如何处理才是推荐的方式呢?
你需要使用像monit/bluepill/god/upstart这样的第三方服务来监视进程并重新启动它。我建议使用foreman和upstart的组合。请参见此处:http://blog.daviddollar.org/2011/05/06/introducing-foreman.html
我的解决方案是在用户的主目录下创建一个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
我在处理我的应用程序时遇到了同样的问题。因此,我编写了一个Rake任务,每分钟运行一次(作为cron作业)。当延迟作业启动时,它将在临时文件夹中创建一个.pid文件。我使用这个来检查延迟作业进程的存在。如果文件不存在,我通过代码运行控制台命令。
delayed_job_status = File.file?("./tmp/pids/delayed_job.pid")
./bundle exec script/delayed_job start production
前段时间我为DelayedJob编写了一个补丁,以便在开发模式下重新加载每个作业的类。同样的补丁也适用于您的需求。
如果您已经有这样的监控工具,那么betamatt的方法绝对是一种可行的方法。
另一种方法是将一个脚本添加到您的操作系统启动项中,该脚本在具有必要权限的用户下运行RAILS_ENV=development QUEUE=mailer rake jobs:work
命令。
以下是在Ubuntu使用Upstart上执行此操作的示例,但是如果您查找类似的init.d
方法或适用于您的服务器操作系统的其他方法,您会发现其他方法。基本上,您要寻找的是“如何在启动时运行脚本[您的操作系统名称]”,然后将您的命令包装在可执行脚本中。