17

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

我正在编写一个与数据库交互并通过 cron 定期启动的 shellscript - 但这是很多双重努力,所以我想知道“Rails Way”或“Ruby Way”会是什么。我正在使用 Ubuntu、Apache 和Passenger。您能否建议甚至可能包含在应用程序中的更好方法,以便我可以轻松地将应用程序部署到另一台机器而无需与 cron 混在一起?

4

6 回答 6

19

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

查看http://railscasts.com/episodes/164-cron-in-ruby以获取有关 whenver gem 的更多信息。

每当 gem的主要好处是,它将您的应用程序需求(即,在应用程序中每 x 小时运行一次的 cron 作业)保留在您的应用程序中,从而增加了应用程序的可移植性。

于 2010-01-17T06:47:12.913 回答
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
于 2010-01-17T15:04:44.643 回答
1

有多种解决方案。对于最简单的设置,您可以script/runner在 crontab 中使用如下内容:

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 需要更多的设置才能工作,但如果需要控制作业,这可能是值得的。

于 2010-01-17T06:38:32.330 回答
1

尝试使用无论何时。尽管最终它会创建一个 cron,但调度定义将使用 Ruby DSL 在您的应用程序中编写。

于 2010-01-18T03:23:03.197 回答
0

对于小型团队和个人项目,无论何时 gem 都很棒。但是,如果您的公司有一个独立于开发团队的运营团队,那可能并不理想。

在我的上一份工作中,运维团队需要能够看到我们正在安装的 cron,这样他们才能确信它不会对系统产生任何副作用。因此,DSL 解决方案行不通。但是我们(开发人员)希望在版本控制中使用 cron 脚本。

因此,为了妥协,我们使用原始 cron 检查文本文件,类似于:

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

我们在 capistrano 脚本中添加了一个步骤,将其作为部署的一部分安装到 crontab。

于 2010-01-18T04:29:17.227 回答
0

尝试在您的服务器中设置 webmin。如果您的托管站点提供它。转到下面提到的 URL。它易于设置和用户友好。

网址是:

http://your_ip_address:10000/

我已经在我的许多应用程序中使用它来安排 cron 作业。

于 2013-03-25T14:56:23.753 回答