代码之家  ›  专栏  ›  技术社区  ›  z3cko

RubyonRails应用程序中的重复任务:cron还是其他?

  •  16
  • z3cko  · 技术社区  · 16 年前

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

    我正在编写一个shell脚本,它将与数据库交互,并通过cron定期启动——但这是一个很大的双重努力,所以我想知道“rails-way”或“ruby-way”是如何做到这一点的。我正在使用Ubuntu、Apache和Passenger。你能推荐更好的方法吗?这些方法甚至可能包括在应用程序中,这样我就可以轻松地将应用程序部署到另一台机器上,而不必与cron混合使用。

    6 回复  |  直到 13 年前
        1
  •  19
  •   comb Travis    14 年前

    我建议你做些像耙子之类的工作,然后用 whenever gem 生成cron作业以运行rake任务。

    退房, http://railscasts.com/episodes/164-cron-in-ruby ,了解更多有关Whenver宝石的信息。

    的主要好处 每当宝石 它使您的应用程序需求(即,cron作业在应用程序中每隔x小时运行一次)保持在应用程序内部,从而提高应用程序的可移植性。

        2
  •  6
  •   Jaime Bellmyer    16 年前

    我建议将上述两种方法结合起来。您需要一个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 作为网络用户)并添加此行:

    10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss
    
        3
  •  1
  •   Crast    16 年前

    有多种解决方案。对于最简单的设置,可以使用 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。

    有一个很好的设置需要更多的后台工作,但它可能是值得的,如果工作需要控制。

        4
  •  1
  •   Joshua Partogi    16 年前

    试用使用 whenever . 尽管最终它将创建一个cron,但是调度定义将使用RubyDSL写在应用程序中。

        5
  •  0
  •   Sarah Mei    16 年前

    对于小团队和个人项目,无论何时创业板都是伟大的。但是,如果您的公司有一个独立于开发团队的运营团队,那么它可能并不理想。

    在我上次的工作中,操作团队需要能够看到我们安装的cron,这样他们就可以确信它不会对系统产生任何副作用。所以DSL解决方案不起作用。但是我们(开发人员)希望cron脚本在版本控制中。

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

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

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

        6
  •  0
  •   Sumit Munot    13 年前

    尝试在服务器中安装Webmin。如果您的宿主网站提供。转到下面提到的URL。设置方便,使用方便。

    URL是:

    http://your_ip_address:10000/
    

    我在我的许多应用程序中都使用了它,它对我安排cron作业很有用。