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

3

我正在使用Delayed Job来创建任务队列,例如'mailer'

为了使它正常工作,我必须运行以下命令:

$ RAILS_ENV=development QUEUE=mailer rake jobs:work

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

应该如何处理才是推荐的方式呢?


当我运行这个程序时,它会阻塞我的 shell,而且无法被取消 :/ - xeruf
5个回答

1

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

0

我在处理我的应用程序时遇到了同样的问题。因此,我编写了一个Rake任务,每分钟运行一次(作为cron作业)。当延迟作业启动时,它将在临时文件夹中创建一个.pid文件。我使用这个来检查延迟作业进程的存在。如果文件不存在,我通过代码运行控制台命令。

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

  • 这将检查进程的存在。如果响应为空,则转到下一个语句

./bundle exec script/delayed_job start production

  • 这将启动延迟作业

0

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


那不是问题的关键 :-) 但是如果您需要重新加载行为,可以在此处找到一个DJ插件:https://github.com/Viximo/delayed_job-rails_reloader - betamatt
@betamatt,我的解决方案将按照“HappyDeveloper”的要求在开发模式下运行他的服务器和工作程序。在开发模式下,每个请求都会重新加载类。 - Harish Shetty

0

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

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

以下是在Ubuntu使用Upstart上执行此操作的示例,但是如果您查找类似的init.d方法或适用于您的服务器操作系统的其他方法,您会发现其他方法。基本上,您要寻找的是“如何在启动时运行脚本[您的操作系统名称]”,然后将您的命令包装在可执行脚本中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接