2010-01-17 102 views
16

我目前正在编写一个应用程序,它从RSS源获取新的信息,并且必须以特定频率更新这些RSS源。目前我只在用户请求提要时拉动,但我想将该行为更改为自动定期提取。Ruby On Rails应用程序中的重复性任务:Cron或其他?

我正在编写一个与数据库交互的shell脚本,并通过cron定期开始 - 但这是双重的努力,所以我想知道做什么是“Rails方式”或“Ruby方式”。我使用的是Ubuntu,Apache和Passenger。你能否提出更好的方法,甚至可能包含在应用程序中,所以我可以轻松地将应用程序部署到另一台机器,而无需与cron混合?

回答

19

我会建议做一些像rake任务,并使用whenever gem生成您的cron作业来运行rake任务。

查看,http://railscasts.com/episodes/164-cron-in-ruby,了解更多关于何时宝石的信息。

whenever gem的主要优势在于它可以保持应用程序内的应用程序需求(即应用程序中每x个小时运行一次cron作业),从而增加应用程序的可移植性。

1

有多种解决方案。对于最简单的设置,你可以在你的crontab的东西用script/runner像这样:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname 

METHODNAME必须对模型的静态方法。您需要以完整路径引用项目,否则在cron环境中找不到该项目。如果您不熟悉,请查看您的crontab手册页以获取有关crontab语法的信息。例如,上述例子在每天的第0小时的第10分钟(简言之,上午12点10分)运行脚本。

如果您需要更强大的解决方案,可以使用BackgroundRB。 BackgroundRB运行守护进程并支持调度的任务,并可将结果放入数据库中。他们甚至有一个简单的通信协议,以允许您的Web进程请求任务完成,然后有办法检索结果。这使您可以直接从Web界面控制后台作业,而不是仅仅“发生”的crontab。

BackroundRB工作需要更多的设置,但如果需要控制作业,它可能是值得的。

6

我推荐以上两者的组合。即使您已经创建了一个直接方法,您也需要一个rake任务。这是因为服务器管理员想要在cron中运行,您可能还需要偶尔从命令行运行,这是rake任务的优点。

每当插件听起来很酷,但我不能担保。当然,知道如何从头开始做这件事很好,然后使用插件让你的生活更轻松。这是从零开始的方式。

创建一个新的文件,lib/tasks/admin.rake

中,创建任务本身:

namespace :admin 
    desc "Updates all RSS feeds" 
    task :rss => :environment do 
    RssFeed.update_all 
    end 
end 

这里假设你有一个RSSFeed类和update_all方法做你所期望。您可以从命令行调用这个:

rake admin:rss 

,你可以添加这与cron(通过调用crontab -l作为Web用户),并加入这一行:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 
+1

您在了解如何手动执行操作时着重点。 正如我在上面指出的那样,每当gem的主要好处不仅在于编写cron作业清理器的语法,因为它使用了dsl,但它允许您保留该业务需求(cron作业),在使用应用程序进行版本控制时,这种方式在需要扩展时,不必通过cron选项卡搜索,复制cron选项卡,筛选与您的应用程序无关的其他cron作业,更改路径,等等。 你可以用gem生成crontab的附加内容。 – Travis 2010-01-17 19:06:32

+0

我完全同意,我一定会为自己结账该宝石!你是对的,期望crons *应该*成为应用程序的一部分,包含在版本控制中等等。我只是认为我会贡献一点基础。 – 2010-01-17 19:41:06

1

尝试使用whenever。尽管最终它会创建一个cron,但是调度定义将使用Ruby DSL写入您的应用程序中。

0

对于小团队和个人项目,每当宝石很棒时。但是如果你的公司有一个与开发团队分开的操作团队,它可能并不理想。

在我上一份工作中,操作团队需要能够看到我们正在安装的cron,因此他们可以确信它不会对系统产生任何副作用。所以DSL解决方案无法工作。但是我们(开发者)想要版本控制中的cron脚本。

因此妥协,我们检查的文本文件与原始的cron,与此类似:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 

,我们增加了一个步骤是安装到crontab作为部署的一部分Capistrano的脚本。

+1

在您的rails应用程序中输入时,它会输出cron作业。难道你不能把作业输出到一个文件供操作团队看看吗? – ericraio 2011-12-31 19:54:28

0

尝试在您的服务器中设置webmin。如果您的托管网站提供它。转到下面提到的网址。它很容易设置和用户自由。

网址是:

http://your_ip_address:10000/ 

我已经在我的许多应用中它的工作用这个给我安排cron作业。