【问题标题】:Cronjob in ruby on railsRuby on rails 中的 Cronjob
【发布时间】:2015-11-08 17:20:45
【问题描述】:

使用everyge gem 在ruby on rails 中创建一个cronjob。

set :environment, "development"
set :output, {:error => "log/cron_error_log.log" , :standard => "log/cron_log.log" }
every '* * * * * ' do
   command "puts 'you can use raw cron syntax too'"
end

同时更新 crontab 它也添加到 crontab 列表中。但是当我手动测试它时

/home/haseebahmad/projects/social/config/schedule.rb

报错

/home/haseebahmad/projects/social/config/schedule.rb: line 19: every: command not found
/home/haseebahmad/projects/social/config/schedule.rb: line 20: puts 'you can use raw cron syntax too': command not found
/home/haseebahmad/projects/social/config/schedule.rb: line 21: end: command not found

无法正常使用,如何解决

【问题讨论】:

  • 手动测试时,脚本不知道every 函数的来源。 Rails 将自动加载您的 gem,而不是让您使用 require 语句包含到 gem。如果您想通过运行脚本手动测试,则需要包含将 gem 纳入范围的 require 语句。
  • 你在安装 Gem 后是否启动了服务器。希望你没有。
  • 贾斯汀有什么其他的测试方法吗?
  • Arup 已经重启服务器

标签: ruby-on-rails ruby cron whenever


【解决方案1】:

虽然,有几种方法可以在 Rails 环境中运行计划任务,例如script/runnerRake 等,其中rake 方式超级简单方便,也得到了heroku 等流行部署平台的支持。

要定义 rake 任务,您需要在 Rails 应用程序的 lib/tasks 目录中创建一个文件:lib/tasks/my_cron.rake,然后像这样简单地定义任务:

task :my_cron => :environment do
  puts "doing stuff...."
  SomeClass.do_some_stuff
  puts "done."
end

然后,要运行这个 rake 任务,你可以从命令行运行这个 rake 命令:

rake my_cron

您可以运行:rake -T 命令来查看 Rails 应用程序中所有可用的 rake 任务,如果您像这样为 rake 任务提供 desc

desc 'Running my cron task...'  
task :my_cron => :environment do
  puts "doing stuff...."
  SomeClass.do_some_stuff
  puts "done."
end

然后,当你运行这个:rake -T,这个 rake 任务将出现在 rake taska 列表中!

这些 rake 任务可以使用 heroku scheduler 在 heroku 上轻松安排

当 rake 任务运行良好时,您可能希望在后台处理大量作业,在这种情况下,可以使用几个最流行的 ruby​​ gem resquesidekiq,具体取决于您的需要。

【讨论】:

  • 谢谢........还有一件事,我在一个例子中看到他们在任务中使用命名空间。你能告诉我它的目的是什么吗?
  • namespace 基本上是用来分组和组织几个任务的。例如,如果您在 Rails 应用程序的任何目录中点击 rake -T,您将看到不同的 rake 任务,如 rake db:createrake db:migraterake db:drop 等任务。这些都是与数据库相关的任务,并分组在同一命名空间db 下。现在清楚了吗?
【解决方案2】:

我建议将您的 ruby​​ 命令/脚本移至 rake 任务。

这样你可以通过 rake 测试 ruby​​ 命令是否正常工作,即 ruby​​ 的东西由 rake 处理。

那么你只需要在 cron 作业中运行 rake 命令即可。因此,您无需测试 cron,这很麻烦。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2013-08-04
    • 1970-01-01
    • 2020-10-02
    • 2013-02-13
    • 2021-10-29
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多