我目前正在编写一个从RSS源中提取新信息的应用程序,并且必须以一定的频率更新这些RSS源。目前,我只在用户请求提要时拉取,但我希望将该行为更改为自动定期获取。
我正在写一个Rails脚本,它将与数据库交互,并通过cron定期启动-但这需要付出大量的努力,所以我想知道做这件事的"Rails方式“或"Ruby方式”是什么。我使用的是Ubuntu,Apache和Passenger。你能推荐一些更好的方法,甚至可能包含在应用程序中,这样我就可以轻松地将应用程序部署到另一台机器上,而不必与cron打交道吗?
发布于 2010-01-17 14:47:13
我建议做一些类似于rake任务的事情,并使用whenever gem生成您的cron作业来运行rake任务。
请查看http://railscasts.com/episodes/164-cron-in-ruby,了解更多关于whenver的信息。
whenever gem的主要好处是它将应用程序的需求(即应用程序中每x小时运行一次的cron作业)保存在应用程序中,从而提高了应用程序的可移植性。
发布于 2010-01-17 23:04:45
我推荐以上两种方法的组合。你想要一个rake任务,即使你已经创建了一个直接的方法。这是因为您希望在cron中运行的服务器管理工作,您可能还希望偶尔从命令行运行,而这正是rake任务的优势所在。
whenever插件听起来很酷,尽管我不能保证它。当然,知道如何从头开始做事情,然后使用插件让你的生活变得更容易是件好事。这是从头开始的方法。
创建一个新文件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中(通过以web用户身份调用crontab -l
)并添加以下行:
10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss
发布于 2010-01-17 14:38:32
有多种解决方案。对于最简单的设置,您可以在crontab中使用script/runner
,如下所示:
10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname
Methodname必须是模型上的静态方法。您需要通过完整路径引用项目,否则很可能在cron环境中找不到它。如果您不熟悉,请查看crontab
手册页,了解有关crontab语法的信息。例如,上面的代码在每天的第0个小时的第10分钟(简称为12:10am )运行脚本。
如果你需要一个更强大的解决方案,你可以使用BackgroundRB。BackgroundRB运行一个守护进程,支持调度任务,并且可以将结果放入数据库中。它们甚至有一个简单的通信协议,允许您的web进程请求完成一个任务,然后有一种方法来检索结果。这允许你直接从web界面控制后台作业,而不是crontab,这只是“发生”。
BackroundRB需要更多的设置才能工作,但如果需要控制作业,这可能是值得的。
https://stackoverflow.com/questions/2080188
复制相似问题