【问题标题】:crontab didn't work in Rails rake taskcrontab 在 Rails rake 任务中不起作用
【发布时间】:2014-01-03 05:32:26
【问题描述】:

我的 Rails 应用程序中有一个 rake 任务,当我在我的 Rails 应用程序路径 /home/hxh/Share/ruby/sport/ 中执行命令时:

rake get_sportdata

这会很好。

现在,我想用crontab 把这个rake 变成timed task .so,我添加一个任务:

* * * * * cd /home/hxh/Share/ruby/sport && /usr/local/bin/rake get_sportdata >/dev/null 2>&1

但这不起作用。我在cron.log文件中获取了日志:

Job `cron.daily' terminated

我想知道错误在哪里。

【问题讨论】:

  • 删除 >/dev/null 2>&1 可能会帮助您看到一些东西。
  • 如果我删除它,我看不到任何关于错误的信息。

标签: ruby-on-rails rake crontab


【解决方案1】:

“cd /home/hxh/Share/ruby/sport && /usr/local/bin/rake get_sportdata >/dev/null 2>&1”可以在您的终端上运行吗?

但是在 Rails 中使用 crontab 通常不是一个好主意。它每次都会加载 Rails 环境并降低性能。

我认为whenever 或 rufus-scheduler 都不错。例如,使用 rufus-scheduler 非常容易。在 config\initializers\schedule_task.rb

require 'rubygems'
require 'rufus/scheduler'


scheduler = Rufus::Scheduler.start_new(:thread_name => "Check Resources Health")
scheduler.every '1d', :first_at => Time.now do |job|
  puts "###########RM Schedule Job - Check Resources Health: #{job.job_id}##########"
  begin
    HealthChecker.perform
  rescue Exception => e
    puts e.message
    puts e.backtrace
    raise "Error in RM Scheduler - Check Resources Health " + e.message
  end
end

并在控制器中实现“执行”或其他一些类方法,现在控制器是“HealthChecker”。非常容易,不需要额外的努力。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    以便您可以更好地测试,并了解它是否有效,我建议:

    1. [app root]/script 中编写一个shell 脚本,设置正确的环境变量以指向Ruby(如果需要)并调用rake。例如,script/get-sportdata.sh
    2. 以 root 身份测试脚本。例如,首先执行sudo -s
    3. 从 cron 调用此脚本。例如,* cd [...] && script/get-sportdata.sh。如有必要,也以 root 身份测试该行。

    这是我成功的秘诀,在 Ubuntu 上从 cron 运行 rake 任务。这是因为 cron 环境与通常的 shell 设置有点不同。因此,将您的实际 cron 作业限制为运行特定脚本的简单命令是将配置划分为可以单独测试的较小部分的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2012-01-27
      • 2012-07-31
      • 2011-06-22
      • 2019-05-31
      • 2017-06-21
      相关资源
      最近更新 更多