当前位置:  开发笔记 > 编程语言 > 正文

rails的cron工作:最佳实践?

如何解决《rails的cron工作:最佳实践?》经验,为你挑选了11个好方法。

在Rails环境中运行计划任务的最佳方法是什么?脚本/亚军?耙?



1> Jim Garvin..:

我在非常受欢迎的Whenever用于严重依赖计划任务的项目,这很棒.它为您提供了一个很好的DSL来定义您的计划任务,而不必处理crontab格式.来自README:

每当Ruby gem为编写和部署cron作业提供清晰的语法时.

自述文件中的示例:

every 3.hours do
  runner "MyModel.some_process"       
  rake "my:rake:task"                 
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do 
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end


如果每分钟运行一次,环境将每次重新启动,这可能是昂贵的.似乎https://github.com/ssoroka/scheduler_daemon避免了这一点.
+1用于保持版本控制系统的cron配置
我认为这是最好的解决方案.如果您正在使用rails,我认为最好在rails中编写所有内容.使用这种方法,您还可以在更改服务器时忘记cron任务,它随应用程序移动.

2> tardate..:

我正在使用rake方法(由heroku支持)

使用名为lib/tasks/cron.rake的文件..

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

要从命令行执行,这只是"rake cron".然后可以根据需要将此命令放在操作系统cron/task scheduler上.

更新这是一个很老的问题和答案!一些新信息:

我引用的heroku cron服务后来被Heroku Scheduler取代

频繁的任务(尤其是要避免Rails环境启动成本)我的首选方法是使用系统cron来调用脚本,这将是(a)捅了安全/私有网络挂接API调用所需的任务在后台或(b)直接将任务列入您选择的排队系统


注意:这些天我每次都在使用(参见Jim Garvin的回答),但是运行rake任务的原始cron条目类似于:30 4***/bin/bash -l -c'cd/opt/railsapp && RAILS_ENV =生产佣金cron --silent'
这种方法的问题是`:environment`依赖.我们有一个非常繁重的Rails应用程序需要很长时间才能启动,我们的Rake每分钟调用一次并消耗更多资源启动执行**任务的**Rails环境**.我希望有一个已经_started up_Rails环境通过cron调用,必须是_controller_方法和_rake environment_之间的东西.

3> 小智..:

在我们的项目中,我们首先使用gem,但遇到了一些问题.

然后我们切换到RUFUS SCHEDULER gem,结果证明在Rails中调度任务非常容易和可靠.

我们已经将它用于发送每周和每日邮件,甚至用于运行一些定期的佣金任务或任何方法.

这里使用的代码如下:

    require 'rufus-scheduler'

    scheduler = Rufus::Scheduler.new

    scheduler.in '10d' do
      # do something in 10 days
    end

    scheduler.at '2030/12/12 23:30:00' do
      # do something at a given point in time
    end

    scheduler.every '3h' do
      # do something every 3 hours
    end

    scheduler.cron '5 0 * * *' do
      # do something every day, five minutes after midnight
      # (see "man 5 crontab" in your terminal)
    end

要了解更多信息,请访问:https://github.com/jmettraux/rufus-scheduler


您是否可以更加具体地了解您遇到的问题?

4> Freakent..:

假设您的任务完成时间不长,只需创建一个新控制器,并为每个任务执行操作.将任务的逻辑实现为控制器代码,然后在操作系统级别设置一个cronjob,使用wget以适当的时间间隔调用此控制器的URL和操作.这种方法的优点是:

    像在普通控制器中一样,可以完全访问所有Rails对象.

    可以像正常行动一样进行开发和测试.

    也可以从简单的网页调用您的任务.

    不要通过启动其他ruby/rails进程来消耗更多内存.


这个老问题是"rails cron"的最佳google结果.这个答案远非最好的方法.请参阅其他回复以获得更明智的建议.
我知道这是不久前的事,但这绝对不是再做cron工作的最好方法.当有很多其他方法可以访问Rails环境时,为什么要通过Web界面,违反界面真正代表的内容?
如何防止他人访问此任务?如果任务占用cpu并经常调用它会导致问题.
"假设你的任务不需要太长时间才能完成"的资格看起来像是一个巨大的资格.使用更普遍有用的方法,而不仅仅是在任务非常快的情况下,这不是更好吗?这样你就不会经常重新评估是否需要使用不同的方法重写这个或那个任务.
不是最好的方式.您可以通过cron作业访问Rails环境,而无需调用REST服务.耙方法肯定更好

5> webmat..:

脚本/跑步者和rake任务完全可以作为cron作业运行.

这是运行cron作业时必须记住的一件非常重要的事情.它们可能不会从您应用的根目录中调用.这意味着您对文件的所有要求(与库相对)应该使用显式路径:例如File.dirname(__ FILE__)+"/ other_file".这也意味着你必须知道如何从另一个目录显式调用它们:-)

检查您的代码是否支持从另一个目录运行

# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development

此外,cron作业可能不会像你一样运行,所以不要依赖你放在.bashrc中的任何快捷方式.但这只是一个标准的cron提示;-)



6> Abdo..:

每次(和cron)的问题是它每次执行时都会重新加载rails环境,这在你的任务频繁或需要进行大量初始化工作时才是真正的问题.因此我在制作方面遇到了问题,必须警告你.

Rufus调度程序为我做(https://github.com/jmettraux/rufus-scheduler)

当我有很长的工作要运行时,我将它用于delayed_job(https://github.com/collectiveidea/delayed_job)

我希望这有帮助!



7> Tyler Morgan..:

我是resque/resque调度程序的忠实粉丝.您不仅可以在特定时间运行重复的类似cron的任务,还可以运行任务.缺点是,它需要一台Redis服务器.



8> AlexParamono..:

有趣的是没有人提到Sidetiq.如果您已经使用Sidekiq,这是很好的补充.

Sidetiq提供了一个简单的API,用于定义Sidekiq的重复工作者.

工作将如下所示:

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { hourly.minute_of_hour(15, 45) }

  def perform
    # do stuff ...
  end
end



9> Luke Francl..:

两者都可以.我通常使用脚本/跑步者.

这是一个例子:

0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1

如果加载正确的配置文件以连接到数据库,也可以编写纯Ruby脚本来执行此操作.

如果内存很珍贵,要记住的一件事是脚本/运行程序(或依赖于'环境'的Rake任务)将加载整个Rails环境.如果您只需要将一些记录插入数据库,那么这将使用您实际不需要的内存.如果您编写自己的脚本,则可以避免这种情况.我还没有真正需要这样做,但我正在考虑它.



10> Thibaut Barr..:

使用Craken(rake centric cron jobs)



11> salt.racer..:

我用backgroundrb.

http://backgroundrb.rubyforge.org/

我使用它来运行计划任务以及对于正常客户端/服务器关系花费太长时间的任务.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有