Ruby On Rails应用程序中的重复任务:Cron还是其他?

z3c*_*cko 16 ruby ruby-on-rails passenger task

我目前正在编写一个从RSS源中提取新信息的应用程序,并且必须以特定频率更新这些RSS源.目前我只在用户请求提要时才提取,但我想将该行为更改为自动定期提取.

我正在编写一个与数据库交互的shellcript,并通过cron定期启动 - 但这需要大量的双重努力,所以我想知道"Rails Way"或"Ruby Way"是做什么的.我正在使用Ubuntu,Apache和Passenger.你能否提出一些甚至可能包含在应用程序中的更好的方法,这样我就可以轻松地将应用程序部署到另一台机器而无需与cron混合?

Tra*_*vis 19

我建议做一些类似rake任务的事情,并使用whatever gem生成你的cron作业来运行rake任务.

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

每当gem的主要好处是它可以保持应用程序内的应用程序要求(即应用程序中每隔x小时运行一次cron作业),从而提高应用程序的可移植性.


Jai*_*yer 6

我建议将上述两者结合使用.即使您已经创建了直接方法,也需要rake任务.这是因为你想在cron中运行的服务器管理员,你可能也想偶尔从命令行运行,这就是rake任务的好处.

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

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

在里面,创建任务本身:

namespace :admin
  desc "Updates all RSS feeds"
  task :rss => :environment do
    RssFeed.update_all
  end
end
Run Code Online (Sandbox Code Playgroud)

这假设您有一个RssFeed类,update_all方法可以满足您的期望.您可以从命令行调用它:

rake admin:rss
Run Code Online (Sandbox Code Playgroud)

您可以将此添加到cron(通过调用crontab -lWeb用户)并添加以下行:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss
Run Code Online (Sandbox Code Playgroud)