crontab在Rails rake任务中不起作用

时间:2014-01-02 02:49:57

标签: ruby-on-rails rake crontab

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

rake get_sportdata

这样可以正常工作。

现在,我想使用crontab将此rake设为timed task。所以我添加了一项任务:

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

但是这不起作用。我在cron.log文件中登录:

Job `cron.daily' terminated

我想知道错误的位置。

2 个答案:

答案 0 :(得分:1)

这样你就可以更好地测试,并掌握它是否有效我建议:

  1. [app root]/script中编写一个shell脚本,它设置正确的环境变量以指向Ruby(如果需要)并调用rake。例如,script/get-sportdata.sh
  2. 以root身份测试脚本。例如,首先做sudo -s
  3. 从cron调用此脚本。例如,* cd [...] && script/get-sportdata.sh。如有必要,也可以将该行测试为root。
  4. 这是我成功的秘诀,在Ubuntu上从cron运行rake任务。这是因为cron环境与通常的shell设置略有不同。因此,将实际的cron作业限制为运行特定脚本的简单命令是将配置划分为可以单独测试的较小部分的好方法。

答案 1 :(得分: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

在控制器中实现“perform”或其他类方法,现在控制器是“HealthChecker”。非常容易,没有额外的努力。希望它有所帮助。