我的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
我想知道错误的位置。
答案 0 :(得分:1)
这样你就可以更好地测试,并掌握它是否有效我建议:
[app root]/script
中编写一个shell脚本,它设置正确的环境变量以指向Ruby(如果需要)并调用rake
。例如,script/get-sportdata.sh
。sudo -s
。* cd [...] && script/get-sportdata.sh
。如有必要,也可以将该行测试为root。这是我成功的秘诀,在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”。非常容易,没有额外的努力。希望它有所帮助。